C#入出力リダイレクト方法2:非同期プロセス

3614 ワード

イベントと依頼を使用して、プロセスには2つのイベントOutputDataReceived、ErrorDataReceivedがあり、標準出力と標準エラー出力のリダイレクトに使用できます.
 
InputDataReceivedはプロセスのイベントではないので、標準入力はこのようにリダイレクトできません.
 
使用前に追加する必要があります.  using System.Diagnostics; //使用可能プロセス
ステップ1:必要な成分の特定
 
1 Process StartInfostartInfo =newProcessStartInfo(.exe);

2 startInfo.CreateNoWindow = true;   //     

3 startInfo.UseShellExecute = false;

4 //           ,           false

5 startInfo.RedirectStandardOutput = true; //

6 startInfo.RedirectStandardError = true;

 
 
ステップ2:try catchブロックの使用
 
 1  try

 2 {

 3   Processprocess = Process.Start(startInfo);

 4   process.OutputDataReceived += (s, _e)=> Console.WriteLine(_e.Data);

 5   process.ErrorDataReceived += (s, _e) =>Console.WriteLine(_e.Data);

 6   // EnableRaisingEvents true,     Process          

 7   process.Exited += (s, _e) => Console.WriteLine("Exited with " + _process.ExitCode);

 8   process.EnableRaisingEvents = true;

 9   process.BeginOutputReadLine();

10   process.BeginErrorReadLine();

11   process.WaitForExit();

12 }

13 catch (Exception e)

14 {

15   Console.WriteLine(ex.Message);

16 }

 
同じリダイレクト・ストリームに対して非同期および同期読み出し操作を混在させることはできないことに注意してください.
非同期モードまたは同期モードでProcessのリダイレクトストリームを開いた後、そのストリームに対するさらなる読み取り操作はすべて同じモードで行わなければならない.
たとえば、StandardOutputストリームに対してBeginOutputReadLineを呼び出してからReadLineを呼び出さないでください.逆も同様です.
しかし、異なるモードで2つの異なるストリームを読み取ることができる.たとえば、BeginOutputReadLineを呼び出してからStandardErrorストリームのReadLineを呼び出すことができます.