2008-09-15 16 views
18

que tienen un objeto System.Diagnostics.Process en un programa dirigido a la NET Framework 3.5¿Cómo puedo saber cuándo ha llegado el último OutputDataReceived?

he redirigido ambos StandardOutput y StandardError tuberías y yo estoy recibiendo datos de ellos de forma asíncrona. También configuré un controlador de eventos para el evento Exited.

Una vez que llamo al Process.Start() quiero salir y hacer otro trabajo mientras espero que se levanten los eventos.

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

¿Cómo puedo saber cuándo se recibió la última OutputDataReceived? Idealmente, me gustaría que el evento Exited sea el último evento que reciba.

Aquí es 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); 
    } 


    } 
} 

Cuando se ejecuta este programa se dará cuenta de que "Exited (Evento)" aparece en un lugar 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 nuevamente: ¿cómo sé cuándo se recibió el último OutputDataReceived? Idealmente, me gustaría que el evento Exited sea el último evento que reciba.

Respuesta

23

La respuesta a esto es que e.Data will be set to null:

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