問題
外部プロセスがテキストを出力するという問題がありますが、私の C# アプリケーションはそれをキャッチできません。外部プロセスは永久に実行され続け、時々テキストを出力します。
次のコードは部分的に機能します...コンソールは開きますが、プロセスがデータを出力していると思っても、コンソール ウィンドウを手動で閉じるまで何も起こりません。その時点で、コンソール ウィンドウに、外部プロセスが何を言わなければならなかったかが出力されます。
私の Visual C# フォームは、次のコードを実行します。
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "MyFile.exe";
p.StartInfo.Arguments = "arguments";
p.StartInfo.RedirectStandardInput = false;
p.StartInfo.RedirectStandardOutput = false;
p.StartInfo.RedirectStandardError = false;
p.StartInfo.CreateNoWindow = false;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.OutputDataReceived += new DataReceivedEventHandler( pOutputHandler );
p.ErrorDataReceived += new DataReceivedEventHandler( pOutputHandler );
started = p.Start();
//p.BeginOutputReadLine();
//p.BeginErrorReadLine();
と
private void pOutputHandler( object sendingProcess, DataReceivedEventArgs outLine )
{
Console.writeLine( outLine.data + Environment.NewLine;
}
私が試したこと
RedirectStandardInput
,RedirectStandardOutput
,RedirectStandardError
andCreateNoWindow
を trueに設定してBeginOutputReadLine
andのBeginErrorReadLine
行のコメントを外すと、まったく何も起こっていないように見えます。- 外部プロセスを変更して、文字列を出力し、終了するようにしました。その場合、私のコード (リダイレクトとコメントなし) は正常に動作しているように見えました。
予測?
外部プロセスが実際には実行されておらず、スタックしている可能性はありますか? では、コンソール ウィンドウを閉じるまでスタックしたままになるのはなぜですか?
追加情報
さらにテストを重ねているうちに、この問題は外部プロセスに起因するのではないかと考え始めています。次のプロセスを C++ で記述しました。
int main()
{
int x = 0;
while( x < 100 )
{
Sleep( 100 );
x = x + 1;
cout << "Testing 123! " << x << "\r";
}
return 1;
}
このプロセスを C# アプリケーションで外部プロセスとして使用しているときに、プロセスが完了して終了した瞬間に、出力がハンドラーにキャッチされます。非同期コールバックがプロセスの終了後にのみ出力をキャッチするのはどうしてでしょうか? それが起こらないようにして、出力を「ライブ」でキャッチするにはどうすればよいですか?