0

C#プログラムからプロセスとして実行しているコンソールアプリケーションがあります。
このプロセスが終了したときに呼び出されるイベントハンドラーを作成しました。
このプロセスの標準出力をイベントハンドラー内に出力するにはどうすればよいですか。基本的に、イベントハンドラー内のプロセスのプロパティにアクセスするにはどうすればよいですか?
私のコードは以下のようになります。

public void myFunc()
{
.
.
Process p = new Process();
p.StartInfo.FileName = "myProgram.exe";
p.StartInfo.RedirectStandardOutput = true;
p.EnableRaisingEvents = true;
p.Exited += new EventHandler(myProcess_Exited);
p.Start();
.
.
}

private void myProcess_Exited(object sender, System.EventArgs e)
{

    Console.WriteLine("log: {0}", <what should be here?>);
}

プロセスオブジェクトpをクラスのフィールドにしたくありません。

また、System.EventArgs eフィールドの用途は何ですか?これはどのように使用できますか?

4

3 に答える 3

2

イベントハンドラーで

object sender

はProcessオブジェクトです(これは、.NET Framework全体でかなり一般的なパターンです)

Process originalProcess = sender as Process;
Console.WriteLine("log: {0}", originalProcess.StandardOutput.ReadToEnd());

以下を設定する必要があることにも注意してください。

p.StartInfo.UseShellExecute = false;

プロセスでIOリダイレクトを使用します。

于 2012-07-03T20:52:58.260 に答える
1

1つのオプションは、クロージャーでそれをキャプチャすることです。

public void myFunc()
{
    Process p = new Process();
    p.StartInfo.FileName = "myProgram.exe";
    p.StartInfo.RedirectStandardOutput = true;
    p.EnableRaisingEvents = true;
    p.Exited += new EventHandler((sender, args) => processExited(p));
    p.Start();
}

private void processExited(Process p)
{
    Console.WriteLine(p.ExitTime);
}
于 2012-07-03T21:00:18.893 に答える
1

このように使用します:

private void myProcess_Exited(object sender, System.EventArgs e)
{
    Process pro = sender as Process; 
    string output = pro.StandardOutput.ReadToEnd()
    Console.WriteLine("log: {0}", output);
}

標準出力は、StreamReaderに他なりません。

于 2012-07-03T20:49:42.587 に答える