如何实时处理辅助流程的输出?

时间:2012-04-27 22:44:43

标签: .net vb.net perl vb.net-2010

我正在尝试编写一个运行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事件。这意味着当我使用真实脚本时,它很可能在几个小时内什么也不做,然后必须同时处理5,000个事件,尽管事情是以相当规律的间隔打印的整个时间。

有没有什么方法可以让它在写入时处理每一行文本,而不是在最后一次处理所有文本?

2 个答案:

答案 0 :(得分:1)

我想通过从互联网上复制更多东西来解决这个问题。问题似乎出现在Perl中,它通常不会在每个print语句后刷新标准输出。我真的不知道最后一句话意味着什么,但无论如何,将行local $| = 1;添加到脚本的顶部(这使得它自动刷新标准输出,根据我读过的网站)解决了这个问题。

答案 1 :(得分:0)

While (pscript.HasExited = False)
    Dim sLine As String = pscript.StandardOutput.ReadLine
End While