我正在尝试编写一个运行Perl脚本并读取并使用标准输出的VB .NET程序。我希望能够在打印时分别处理每一行,并相应地更新我的程序显示。下面是一些代码,我已经“写”(读:“主要是复制了互联网”):如何实时处理辅助过程的输出?
Private WithEvents pscript As Process
Private Sub myProgram_Load(sender As Object, e As System.EventArgs) Handles Me.Load
pscript = New Process()
pscript.StartInfo.CreateNoWindow = True
pscript.StartInfo.FileName = "C:\perl64\bin\perl.exe"
pscript.StartInfo.Arguments = "C:\test.pl"
pscript.StartInfo.UseShellExecute = False
pscript.StartInfo.RedirectStandardOutput = True
pscript.StartInfo.RedirectStandardInput = True
AddHandler pscript.OutputDataReceived, AddressOf pscript_output_process
pscript.Start()
pscript.BeginOutputReadLine()
End Sub
Private Sub pscript_output_process(sender As Object, e As DataReceivedEventArgs)
MessageBox.Show(e.Data)
End Sub
这适用于一个问题:程序等待,直到测试脚本运行完毕,然后触发几个OutputDataReceived事件一个接一个。这意味着,当我使用真正的脚本时,它可能会在几个小时内不做任何事情,然后不得不一次处理5000个事件,尽管事实上是以相当规律的间隔印刷在那段时间。
有没有什么办法可以让它在处理每行文本时写入文本,而不是一次处理所有文本?
重定向标准输出。 – dubvfan87 2012-04-27 22:51:48
这可能既不存在也不存在,但帮助文档反复说明:“正在处理异步输出的应用程序应该调用WaitForExit方法以确保输出缓冲区已被刷新” – 2012-04-27 23:50:07
Jim:对WaitForExit的调用会导致应用程序完全冻结,直到脚本完成,否则它以同样的方式工作。 – gorcq 2012-04-28 00:28:02