我有以下问题,希望有人能帮助我。
我有一个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
答案 0 :(得分:2)
据推测,这是在另一个线程上发生的。从GUI线程尝试Kill()
进程,而不是仅设置CancellationPending
。你是正确的ReadLine()
调用是阻塞的,导致while循环在没有更多输出时永远不会重新评估它的条件。
从另一个线程中杀死进程应该有效。 (它可能会引发ReadLine()
的异常,因此请做好准备。)