VB.NET进程BeginOutputReadLine不起作用

时间:2014-08-01 13:37:54

标签: vb.net asynchronous command-line output 7zip

我的目标是实时读取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的输出有关,而不是读取它的代码。

1 个答案:

答案 0 :(得分:0)

只需从代码中删除Proc.WaitForExit() - 它会导致应用程序等待直到结束。

如果您想知道该进程何时退出,请使用另一个Addhandler来捕获Proc.Exited事件