ProcessStartInfo.RedirectStandardError プロパティ
プロセスのエラー出力を Process インスタンスの StandardError メンバに書き込むかどうかを示す値を取得または設定します。このメンバを使用すると、エラー出力を標準エラー ストリーム (通常はモニタ画面) 以外に書き込むことができます。たとえば、エラー データをファイルまたはログに書き込むことができます。
Public Property RedirectStandardError As Boolean
[C#]
public bool RedirectStandardError {get; set;}
[C++]
public: __property bool get_RedirectStandardError();public: __property void set_RedirectStandardError(bool);
[JScript]
public function get RedirectStandardError() : Boolean;public function set RedirectStandardError(Boolean);
プロパティ値
エラー出力を Process.StandardError に書き込む場合は true 。それ以外の場合は false 。
解説
Process コンポーネントは、パイプを使用して子プロセスと通信します。子プロセスからパイプに書き込まれるデータによってバッファが満杯になる場合は、親プロセスがパイプからデータを読み取るまで、子プロセスがブロックされます。アプリケーションが、標準エラー出力および標準出力へのすべての出力を読み取る場合は、このブロック処理がデッドロックの原因になることがあります。この例を次の C# コードに示します。
ProcessStartInfo ps = new ProcessStartInfo("...", "...");
ps.UseShellExecute = false;
ps.RedirectStandardOutput = true;
Process p=new Process();
p.Start(ps);
p.WaitForExit();
string output = p.StandardOutput.ReadToEnd();
このインスタンスでは、パイプが満杯になると子プロセスが完了しなくなりますが、親プロセスは子プロセスの終了を永久に待機し続けます。そのため、親プロセスと子プロセスの両方でブロックが発生します。
この問題は、次のように、 ReadToEnd()
を WaitForExit()
の前に移動することによって解決できます。
ProcessStartInfo ps = new ProcessStartInfo("...", "...");
ps.UseShellExecute = false;
ps.RedirectStandardOutput = true;
Process p=new Process();
p.Start(ps);
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
標準出力と標準エラー出力の両方をリダイレクトし、両方を読み取ろうとすると、似た問題が発生します。この例を次の C# コードで示します。
string output = p.StandardOutput.ReadToEnd();
string error = p.StandardError.ReadToEnd();
p.WaitForExit();
この例では、親プロセスは標準出力からの読み取りを終了するまで標準エラー出力から読み取ることができないため、子プロセスが標準エラー出力にテキストを書き込むと、プロセスがブロックされます。しかし、親プロセスはプロセスが終了するまで標準出力から読み取りません。この問題の解決方法としては、アプリケーションがそれぞれのスレッドでそれぞれのストリームの出力を読み取ることができるように、2 つのスレッドを作成する方法をお勧めします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
参照
ProcessStartInfo クラス | ProcessStartInfo メンバ | System.Diagnostics 名前空間 | UseShellExecute | StandardError