0

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

我有一个运行 shell 程序的 VB .net (2010) 工作人员。

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

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

我能够“捕捉”外壳的输出并将其添加到文本框(使用设置文本功能)。

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

至少我怀疑是这样的。

我试过检查 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()

有任何想法吗?

提前致谢!

问候,

酸碱度

4

1 回答 1

2

大概这发生在另一个线程上。尝试Kill()从 GUI 线程执行该过程,而不仅仅是设置CancellationPending. 调用被阻塞是正确的,ReadLine()一旦没有更多输出,导致 while 循环永远不会重新评估其条件。

从另一个线程杀死进程应该可以工作。(它可能会从 抛出异常ReadLine(),因此请为此做好准备。)

于 2010-11-15T19:55:33.770 回答