Отмена фонового рабочего

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

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

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

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


person PeeHaa    schedule 15.11.2010    source источник
comment
Можете ли вы опубликовать код в событии нажатия кнопки остановки? И любые соответствующие функции, которые код может вызывать?   -  person overslacked    schedule 15.11.2010


Ответы (1)


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

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

person cdhowie    schedule 15.11.2010
comment
ОМГ Ты крут! Спасибо друг. Так просто. позор. Я думал, что процесс недоступен в потоке GUI! Еще раз спасибо. - person PeeHaa; 15.11.2010
comment
Без проблем. Пожалуйста, не забудьте принять этот ответ, если он был полезен. :) - person cdhowie; 15.11.2010
comment
Сделанный. Хотел проголосовать за вас, но не смог (нет представителя). Просто помните, что я хотел проголосовать за вас за то, что это стоит :) - person PeeHaa; 15.11.2010