首页 > 后端开发 > C++ > 为什么``processstartinfo.waitforexit()`块,如何使用异步读取呢?

为什么``processstartinfo.waitforexit()`块,如何使用异步读取呢?

Barbara Streisand
发布: 2025-01-29 20:26:11
原创
198 人浏览过

Why Does `ProcessStartInfo.WaitForExit()` Block, and How Can I Fix It Using Asynchronous Reads?

解决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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板