Rumah >pembangunan bahagian belakang >C++ >Kenapa ProcessStartInfo.WaitForExit () gerai ketika mengalihkan StandardOutput atau StandardError?

Kenapa ProcessStartInfo.WaitForExit () gerai ketika mengalihkan StandardOutput atau StandardError?

DDD
DDDasal
2025-01-29 20:41:09758semak imbas

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

menyelesaikan masalah yang prosesStartInfo.waitForExit () terjebak apabila output regattcing atau kesilapan standard standard

Apabila ProcessStartInfo mengalihkan ke StandardOutput atau StandardError, mungkin ada masalah. Penampan dalaman mungkin melimpah, yang membawa kepada potensi yang berpotensi atau menghalang proses anda.

Untuk mengelakkan kebuntuan sedemikian dan kumpulkan output dari dua aliran, pertimbangkan untuk menggunakan kaedah bacaan tak segerak berikut:

kaedah asynchronous ini memastikan bahawa penampan tidak akan melimpah dan mencegah sistem dari pembekuan. Sekarang anda boleh membaca dan mengumpulkan output tanpa bimbang tentang kunci tertunda atau berpotensi mati. Kod ini telah diperbaiki dan termasuk pemprosesan output ralat.
<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>

Atas ialah kandungan terperinci Kenapa ProcessStartInfo.WaitForExit () gerai ketika mengalihkan StandardOutput atau StandardError?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn