2012-07-24 15 views
32

Próbuję przechwycić dane wyjściowe procesu w czasie rzeczywistym (podczas działania). Kod, którego używam, jest raczej prosty (patrz poniżej). Z jakiegoś dziwnego powodu zdarzenie OutputDataReceived nigdy nie jest wywoływane. Czemu?Przechwytywanie danych wyjściowych procesu za pomocą zdarzenia OutputDataReceived

private void button2_Click(object sender, EventArgs e) 
    { 
     // Setup the process start info 
     var processStartInfo = new ProcessStartInfo("ping.exe", "-t -n 3 192.168.100.1") 
     { 
     UseShellExecute = false, 
     RedirectStandardOutput = true 
     }; 

     // Setup the process 
     mProcess = new Process { StartInfo = processStartInfo, EnableRaisingEvents = true }; 

     // Register event 
     mProcess.OutputDataReceived += OnOutputDataReceived; 

     // Start process 
     mProcess.Start(); 
     mProcess.WaitForExit(); 
    } 

    void OnOutputDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     //Never gets called... 
    } 

Odpowiedz

52

Trzeba zadzwonić

mProcess.BeginOutputReadLine(); 

BeginOutputReadLine - "Rozpoczyna asynchroniczne operacje odczytu na przekierowanego StandardOutput strumienia aplikacji"

+6

Ponadto Proces zewnętrzne jest wymagane opróżnić swój bufor wyjściowy w momencie wyprowadza coś. Bez płukania bufor wyjściowy może trwać do momentu zakończenia procesu zewnętrznego; to sprawia, że ​​główna aplikacja nie może przechwycić wyjścia "na żywo". –

+1

@BobKruithof: To prawda. Zewnętrzny proces musi faktycznie wysłać dane, ale bez żadnych innych informacji najłatwiej jest zadać pytanie. :) – Chris

+1

Również niektóre aplikacje zapisują do standardowego ERROR zamiast standardowego OUTPUT. Zwykle nie można zrobić różnicy, patrząc ręcznie na wynik. Tak więc, spróbuj dodać na wszelki wypadek: odpowiednio "RedirectStandardError = true" i "mProcess.BeginErrorReadLine();". – altumano

0

void ExecuteCommand(string cmdpath, string cmdargs) 
{ 
    string command = cmdpath + " " + cmdargs; 

    tabc_results.SelectTab(1); 
    DoConsole("\r\nCmd>> " + command + "\r\n"); 

    var processInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c " + command); 
    processInfo.CreateNoWindow = true; 
    processInfo.UseShellExecute = false; 
    processInfo.RedirectStandardError = true; 
    processInfo.RedirectStandardOutput = true; 

    var process = System.Diagnostics.Process.Start(processInfo); 

    process.OutputDataReceived += (
     object sender, System.Diagnostics.DataReceivedEventArgs e 
    ) => DoConsole("stdout>> " + e.Data + "\r\n"); 
    //Console.WriteLine("output>>" + e.Data); 
    process.BeginOutputReadLine(); 

    process.ErrorDataReceived += (
     object sender, System.Diagnostics.DataReceivedEventArgs e 
    ) =>DoConsole("stderr>> " + e.Data + "\r\n"); 
    //Console.WriteLine("error>>" + e.Data); 
    process.BeginErrorReadLine(); 

    process.WaitForExit(); 

    DoConsole("retcode>> " + process.ExitCode.ToString() + "\r\n"); 
    //Console.WriteLine("ExitCode: {0}", process.ExitCode); 
    process.Close(); 
} 
Powiązane problemy