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

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

DDD
Lepaskan: 2025-01-29 20:41:09
asal
757 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan