gpt4 book ai didi

c# - 我如何知道最后一个 OutputDataReceived 何时到达?

转载 作者:IT王子 更新时间:2023-10-29 04:34:40 28 4
gpt4 key购买 nike

我在一个针对 .Net Framework 3.5 的程序中有一个 System.Diagnostics.Process 对象

我已经重定向了 StandardOutputStandardError 管道,并且我从它们异步接收数据。我还为 Exited 事件设置了一个事件处理程序。

调用 Process.Start() 后,我想在等待引发事件的同时离开并做其他工作。

不幸的是,对于返回大量信息的进程,Exited 事件似乎在最后一个 OutputDataReceived 事件之前触发。

我如何知道何时收到最后一个 OutputDataReceived?理想情况下,我希望 Exited 事件是我收到的最后一个事件。

这是一个示例程序:

using System;
using System.Diagnostics;
using System.Threading;

namespace ConsoleApplication1
{
class Program
{

static void Main(string[] args)
{
string command = "output.exe";
string arguments = " whatever";

ProcessStartInfo info = new ProcessStartInfo(command, arguments);

// Redirect the standard output of the process.
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;

// Set UseShellExecute to false for redirection
info.UseShellExecute = false;

Process proc = new Process();
proc.StartInfo = info;
proc.EnableRaisingEvents = true;

// Set our event handler to asynchronously read the sort output.
proc.OutputDataReceived += new DataReceivedEventHandler(proc_OutputDataReceived);
proc.ErrorDataReceived += new DataReceivedEventHandler(proc_ErrorDataReceived);
proc.Exited += new EventHandler(proc_Exited);

proc.Start();
// Start the asynchronous read of the sort output stream. Note this line!
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();

proc.WaitForExit();

Console.WriteLine("Exited (Main)");

}

static void proc_Exited(object sender, EventArgs e)
{

Console.WriteLine("Exited (Event)");
}



static void proc_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine("Error: {0}", e.Data);
}



static void proc_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine("Output data: {0}", e.Data);
}


}
}

运行此程序时,您会注意到“Exited (Event)”出现在输出中一个完全可变的位置。您可能需要运行它几次,显然,您需要将“output.exe”替换为您选择的能够产生大量输出的程序。

那么,问题又来了:我如何知道最后一个 OutputDataReceived 何时收到?理想情况下,我希望 Exited 事件是我收到的最后一个事件。

最佳答案

答案是 e.Data will be set to null :

static void proc_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
if( e.Data == null ) _exited.Set();
}

关于c# - 我如何知道最后一个 OutputDataReceived 何时到达?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63303/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com