我的目标是实时读取7zip命令行进程的输出。我编写了一个使用BeginOutputReadLine
的异步输出阅读器。如果将该行发送到输出,则此方法应立即返回新行。或者,如MSDN所说:When asynchronous read operations start, the event handler is called each time the associated Process writes a line of text to its StandardOutput stream.
这是我的代码
Private Sub StartProcess()
Dim Proc As New Process
Proc.StartInfo.FileName = Application.StartupPath & "\7z.exe"
Proc.StartInfo.WorkingDirectory = "D:\temp"
Proc.StartInfo.Arguments = "a -t7z ""D:\temp.7z"" -mx=9 -m0=LZMA -ms=on -mhc=on -mmt=on -mtc=off -mta=off -ptest -mhe=off"
Proc.StartInfo.UseShellExecute = False
Proc.StartInfo.RedirectStandardOutput = True
Proc.StartInfo.CreateNoWindow = True
AddHandler Proc.OutputDataReceived, AddressOf OutputHandler
Proc.Start()
Proc.BeginOutputReadLine()
Proc.WaitForExit()
Proc.Dispose()
Proc = Nothing
End Sub
Private Sub OutputHandler(sendingProcess As Object, outLine As DataReceivedEventArgs)
If Not String.IsNullOrEmpty(outLine.Data) Then
Console.WriteLine(outLine.Data)
End If
End Sub
问题是在流程结束之前我没有得到任何一行。之后,所有输出都返回到关联的流OutputHandler
。我的异步代码的结果与使用同步StandardOutput.ReadToEnd
方法非常相似。我做错了什么?
[编辑] 我已经创建了一个批处理文件,用于使用ping命令测试我的代码。这似乎工作! 7zip是否对它的输出做了一些奇怪的事情?因为看起来这个问题与7zip的输出有关,而不是读取它的代码。
答案 0 :(得分:0)
只需从代码中删除Proc.WaitForExit() - 它会导致应用程序等待直到结束。
如果您想知道该进程何时退出,请使用另一个Addhandler来捕获Proc.Exited事件