.net 如何实时处理辅助进程的输出?

.net 如何实时处理辅助进程的输出?,.net,vb.net,perl,vb.net-2010,.net,Vb.net,Perl,Vb.net 2010,我正在尝试编写一个VB.NET程序,它运行一个Perl脚本并读取和使用标准输出。我希望能够在打印时分别处理每一行,并相应地更新我的程序显示。以下是我“编写”的一些代码(读作:“大部分是从互联网上抄袭的”): 这与一个问题有关:程序等待测试脚本运行完成,然后依次触发几个OutputDataReceived事件。这意味着当我让它使用真实的脚本时,它可能会在几个小时内什么都不做,然后不得不一次处理5000个事件,尽管事实上,在这段时间内,内容是以相当固定的间隔打印的 有没有什么方法可以让它在写的时候处

我正在尝试编写一个VB.NET程序,它运行一个Perl脚本并读取和使用标准输出。我希望能够在打印时分别处理每一行,并相应地更新我的程序显示。以下是我“编写”的一些代码(读作:“大部分是从互联网上抄袭的”):

这与一个问题有关:程序等待测试脚本运行完成,然后依次触发几个OutputDataReceived事件。这意味着当我让它使用真实的脚本时,它可能会在几个小时内什么都不做,然后不得不一次处理5000个事件,尽管事实上,在这段时间内,内容是以相当固定的间隔打印的


有没有什么方法可以让它在写的时候处理每一行文字,而不是在结尾一次处理所有文字?

我找到了通过从互联网上复制更多内容来修复它的方法。问题似乎出在Perl中,Perl通常不会在每个print语句之后刷新标准输出。我真的不知道最后一句话是什么意思,但无论如何,添加行
local$|=1到脚本顶部(根据我读到的一个站点,它会自动刷新标准输出)解决了这个问题。

这可能不在这里也不在那里,但帮助文档反复说明“处理异步输出的应用程序应调用WaitForExit方法,以确保输出缓冲区已刷新Jim:调用WaitForExit会导致应用程序完全冻结,直到脚本完成,否则它的工作方式相同。出于某种原因,这只捕获打印的第一行,并且它仍然会等待脚本完成。另外,它会导致我的程序在脚本运行时冻结,这就是为什么我喜欢基于事件的方法(如果可行的话!)“刷新标准输出”的描述有点马虎。它应该说“为标准输出刷新缓冲区”。为了提高效率,默认情况下使用快速RAM缓冲区;只有当缓冲区已满或手动清空(“刷新”)时,数据才会放入流(文件、终端、套接字)。设置将关闭缓冲。(我的解释有点不准确,但要点是正确的;这里没有足够的空间来提及更详细的细节。)阅读以进行更深入的讨论。谢谢你的文章。现在这就更有意义了。
While (pscript.HasExited = False)
    Dim sLine As String = pscript.StandardOutput.ReadLine
End While
While (pscript.HasExited = False)
    Dim sLine As String = pscript.StandardOutput.ReadLine
End While