取消后台工作者

时间:2010-11-15 19:52:40

标签: .net vb.net shell backgroundworker outputstream

我有以下问题,希望有人能帮助我。

我有一个VB .net(2010)的工作者,它运行一个shell程序。

shell程序是一个服务和输出的东西,如:

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

我能够“捕获”shell的输出并将其添加到文本框中(使用set text function)。

我可以通过点击停止按钮来取消工作人员,但是当外壳没有更多输出时,我无法再停止工作。

至少我怀疑是这样的。

我已经尝试检查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 个答案:

答案 0 :(得分:2)

据推测,这是在另一个线程上发生的。从GUI线程尝试Kill()进程,而不是仅设置CancellationPending。你是正确的ReadLine()调用是阻塞的,导致while循环在没有更多输出时永远不会重新评估它的条件。

从另一个线程中杀死进程应该有效。 (它可能会引发ReadLine()的异常,因此请做好准备。)