首頁 > 後端開發 > C++ > 為什麼processstartinfo.waitforexit()在重定向標準輸出或標准設備時會拖延?

為什麼processstartinfo.waitforexit()在重定向標準輸出或標准設備時會拖延?

DDD
發布: 2025-01-29 20:41:09
原創
757 人瀏覽過

Why Does ProcessStartInfo.WaitForExit() Stall When Redirecting StandardOutput or StandardError?

解決 ProcessStartInfo.WaitForExit() 在重定向標準輸出或標準錯誤時卡住的問題

當通過 ProcessStartInfo 重定向 StandardOutput 或 StandardError 時,可能會出現問題。內部緩衝區可能會溢出,導致潛在的死鎖或阻塞您的進程。

為了防止此類死鎖並從兩個流中收集輸出,請考慮使用以下異步讀取方法:

<code class="language-csharp">using System.Diagnostics;
using System.Text;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        string filename = "TheProgram.exe";
        string arguments = "some arguments";
        int timeout = 10000; // 10 秒超时

        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}");
                    Console.WriteLine($"错误: {error}"); //添加错误输出
                }
                else
                {
                    // 超时或发生错误。
                    Console.WriteLine("进程超时或失败。");
                }
            }
        }
    }
}</code>
登入後複製

這種異步方法確保緩衝區不會溢出,防止系統凍結。現在,您可以讀取和收集輸出,而無需擔心延遲或潛在的死鎖。 代碼已改進,包含了錯誤輸出的處理。

以上是為什麼processstartinfo.waitforexit()在重定向標準輸出或標准設備時會拖延?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板