重定向并实时解析 vb.net 中长时间运行进程的标准输出
-
26-09-2019 - |
题
此代码执行“handbrakecli”(命令行应用程序)并将输出放入字符串中:
Dim p As Process = New Process
p.StartInfo.FileName = "handbrakecli"
p.StartInfo.Arguments = "-i [source] -o [destination]"
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardOutput = True
p.Start
Dim output As String = p.StandardOutput.ReadToEnd
p.WaitForExit
问题是这可能需要长达 20 分钟才能完成,在此期间不会向用户报告任何内容。完成后,他们将看到应用程序的所有输出,其中包括进度详细信息。不是很有用。
因此,我试图找到一个示例来展示最佳方法:
- 启动外部应用程序(隐藏)
- 定期监视其输出,因为它显示有关其进度的信息(这样我可以提取它并向用户呈现一个很好的百分比条)
- 确定外部应用程序何时完成(因此我无法继续执行我自己的应用程序)
- 如有必要,终止外部应用程序并检测何时发生这种情况(这样,如果用户点击“取消”,我将采取适当的步骤)
有人有推荐的代码片段吗?
解决方案
StandardOutput 属性的类型为 StreamReader,它具有 ReadToEnd 以外的方法。这将是更多的代码,但如果您使用 Read 方法,您可以执行其他操作,例如为用户提供取消或报告某种类型的进度的机会。
链接到带有代码示例的读取方法:
http://msdn.microsoft.com/en-us/library/ath1fht8(v=VS.90).aspx
编辑:
Process 类还有一个 BeginOutputReadLine 方法,它是带有回调的异步方法调用。
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline(v=VS.90).aspx
不隶属于 StackOverflow