ProcessStartInfo挂在“ WaitForExit”上吗?为什么?

ProcessStartInfo挂在“ WaitForExit”上吗?为什么?,第1张

ProcessStartInfo挂在“ WaitForExit”上吗?为什么?

问题是如果您重定向

StandardOutput
和/或
StandardError
内部缓冲区可能已满。无论您使用什么顺序,都可能出现问题:

  • 如果您在读取
    StandardOutput
    过程之前等待该过程退出,则该过程可能会阻止尝试对其进行写入,因此该过程永远不会结束。
  • 如果从阅读
    StandardOutput
    使用ReadToEnd的,然后 你的 过程可以阻止如果过程永远不会关闭
    StandardOutput
    (例如,如果它永远不会终止,或者如果它被阻止写入
    StandardError
    )。

解决方案是使用异步读取来确保缓冲区未满。为了避免任何死锁并收集两者的所有输出

StandardOutput
StandardError
您可以执行以下 *** 作:

编辑:请参阅下面的答案,以了解如果发生超时,如何避免 ObjectDisposedException

using (Process process = new Process()){    process.StartInfo.FileName = filename;    process.StartInfo.Arguments = arguments;    process.StartInfo.UseShellExecute = false;    process.StartInfo.RedirectStandardOutput = true;    process.StartInfo.RedirectStandardError = true;    StringBuilder output = new StringBuilder();    StringBuilder error = new StringBuilder();    using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false))    using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false))    {        process.OutputDataReceived += (sender, e) => { if (e.Data == null) {     outputWaitHandle.Set(); } else {     output.AppendLine(e.Data); }        };        process.ErrorDataReceived += (sender, e) =>        { if (e.Data == null) {     errorWaitHandle.Set(); } else {     error.AppendLine(e.Data); }        };        process.Start();        process.BeginOutputReadLine();        process.BeginErrorReadLine();        if (process.WaitForExit(timeout) && outputWaitHandle.WaitOne(timeout) && errorWaitHandle.WaitOne(timeout))        { // Process completed. Check process.ExitCode here.        }        else        { // Timed out.        }    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4900268.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存