2012-07-24 18 views
32

「リアルタイム」(プロセスの実行中)でプロセス出力を取得しようとしています。私が使用するコードはかなりシンプルです(下記参照)。いくつかの奇妙な理由で、OutputDataReceivedイベントが呼び出されることはありません。どうして?OutputDataReceivedイベントを介したプロセス出力のキャプチャ

あなたが

mProcess.BeginOutputReadLine(); 

BeginOutputReadLineを呼び出す必要が

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... 
    } 

答えて

52

は - "アプリケーションのリダイレクトStandardOutputストリーム上で、非同期読み取り操作を開始します。"また

+6

、外部プロセスへは、それが何かを出力した瞬間に、その出力バッファをフラッシュする必要があります。フラッシングなしでは、出力バッファは外部プロセスが終了するまで持続することができます。これにより、メインアプリケーションが出力 "ライブ"をキャプチャすることが不可能になります。 –

+1

@BobKruithof:十分に真実。外部プロセスは実際にデータを送信する必要がありますが、その他の情報は一切不要です。 :) – Chris

+1

また、標準のOUTPUTの代わりに標準のERRORに書き込むアプリケーションもあります。通常、出力を手動で見るときは違いはありません。ですから、「RedirectStandardError = true」と「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(); 
} 
関連する問題