2010-11-15 6 views
0

У меня есть следующая проблема, и я надеюсь, что кто-то сможет мне помочь.Отмена фонового работника

У меня есть рабочий в VB .net (2010), который запускает shell-программу.

Программа оболочка представляет собой сервис и выход такие вещи, как:

Server initializing... 
Server opening port... 
more info... 

Я могу «поймать» выход из оболочки и добавить его в текстовое поле (с использованием набора текста функции).

И я могу отменить рабочего, нажав на кнопку остановки, однако, когда больше нет вывода от оболочки, я больше не могу остановить рабочего.

По крайней мере, я подозреваю, что это так.

Я пробовал проверку для endofstream (комментарий), но это не работает.

Я также попытался использовать тот же код с некоторым тестовым текстом вместо «clsProcess.StandardOutput.ReadLine», и это также работает.

Итак, я пришел к выводу, что он должен иметь какое-то отношение к clsProcess.StandardOutput.ReadLine, находясь в конце ???

Try 
     clsProcess.StartInfo.UseShellExecute = False 
     clsProcess.StartInfo.RedirectStandardOutput = True 
     clsProcess.StartInfo.RedirectStandardError = True 
     clsProcess.StartInfo.FileName = serverpath + config_executable 
     clsProcess.StartInfo.CreateNoWindow = True 
     clsProcess.Start() 
    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Critical, "Error starting server") 
     Debug.Print(ex.Message) 
    End Try 

    Do While Not workerServer.CancellationPending 
     Try 
      'If Not clsProcess.StandardOutput.EndOfStream Then 
      SetText(clsProcess.StandardOutput.ReadLine + vbNewLine) 
      'End If 
     Catch ex As Exception 
      MsgBox(ex.Message, MsgBoxStyle.Critical, "Error adding line to log") 
     End Try 

     Threading.Thread.Sleep(100) 
    Loop 

    clsProcess.Kill() 

Любые идеи?

Заранее благодарен!

С уважением,

PH

+0

Можете ли вы опубликовать код в событии клика кнопки остановки? И любые соответствующие функции, которые может вызвать код? – overslacked

ответ

2

Предположительно это происходит в другом потоке. Попробуйте Kill() Выполнение процесса из потока графического интерфейса пользователя, а не только CancellationPending. Вы правы, что вызов ReadLine() блокируется, заставляя цикл while никогда не переоценивать его состояние, когда больше нет вывода.

Убивать процесс из другой нити должно работать. (Может быть сделано исключение из ReadLine(), поэтому будьте готовы к этому.)

+0

OMG Вы рок! Спасибо друг. Так просто. * Стыд *. Я думал, что этот процесс недоступен в потоке графического интерфейса пользователя! Еще раз спасибо. – PeeHaa

+0

Нет проблем. Пожалуйста, не забудьте принять этот ответ, если это было полезно. :) – cdhowie

+0

Готово. Хотел проголосовать за вас, но я не мог (без репрессий). Просто помните, что я хотел проголосовать за то, что стоит :) – PeeHaa