Отмена фонового рабочего - PullRequest
0 голосов
/ 15 ноября 2010

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

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

Программа оболочки - это сервис и вывод, такие как:

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

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

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

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

Я пытался проверить 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

1 Ответ

2 голосов
/ 15 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...