c# asynchronous system.diagnostics

c# - ¿Cómo sé cuándo ha llegado el último OutputDataReceived?



asynchronous system.diagnostics (1)

La respuesta a esto es que e.Data se establecerá en null :

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

Tengo un objeto System.Diagnostics.Process en un programa dirigido a .Net framework 3.5

He redirigido las canalizaciones StandardOutput y StandardError y recibo datos de ellas de forma asincrónica. También configuré un controlador de eventos para el evento Exited.

Una vez que llamo a Process.Start() quiero salir y hacer otro trabajo mientras espero que se generen eventos.

Desafortunadamente, parece que, para un proceso que devuelve una gran cantidad de información, el evento Exited se dispara antes del último evento OutputDataReceived .

¿Cómo sé cuándo se ha recibido el último OutputDataReceived ? Idealmente, me gustaría que el evento Exited sea ​​el último evento que reciba.

Aquí hay un programa de ejemplo:

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); } } }

Al ejecutar este programa, notará que "Exited (Event)" aparece en una ubicación completamente variable dentro de la salida. Es posible que deba ejecutarlo varias veces y, obviamente, tendrá que reemplazar "output.exe" con un programa de su elección que produzca una cantidad de salida adecuada.

Entonces, la pregunta otra vez: ¿cómo sé cuándo se ha recibido el último OutputDataReceived ? Idealmente, me gustaría que el evento Exited sea ​​el último evento que reciba.