解决ProcessStartInfo.WaitForExit()阻塞问题:异步读取方法
在某些情况下,使用ProcessStartInfo
时,程序会在WaitForExit()
处发生无限期挂起。当标准输出缓冲区达到其限制时,就会出现此问题。重定向标准输出和标准错误会加剧这个问题,从而导致死锁。
解决方案在于使用异步读取来防止缓冲区溢出。结合AutoResetEvent
对象和事件处理程序,可以在指定的超时时间内有效地处理输出和错误数据。以下是一个代码示例:
<code class="language-csharp">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.ExitCode。 Console.WriteLine("Output:\n" + output.ToString()); Console.WriteLine("\nError:\n" + error.ToString()); } else { // 超时。 Console.WriteLine("Timed out."); } } }</code>
通过这种方法,您可以有效地避免死锁,收集标准输出和标准错误的所有输出,并在数据可用时收到通知。 添加了输出和错误信息的打印,以便更清晰地了解程序执行结果。 请确保filename
, arguments
, 和 timeout
变量已正确设置。
以上是为什么``processstartinfo.waitforexit()`块,如何使用异步读取呢?的详细内容。更多信息请关注PHP中文网其他相关文章!