8

私は今日この問題に遭遇しました、そしてそれを理解するのにかなりの時間がかかりました。IIS内からプロセスを開始し、その標準出力とエラー出力をリダイレクトしていたので、プロセスが終了したときに、それを使用してログを生成できました。私のマシンではすべてが正常に実行されていましたが、公開した後はあまりうまくいきませんでした。

プロセスはしばらくの間機能し、その後終了するはずでしたが、機能しませんでした。単に応答を停止し、ソケットなどのリソースを保持します。しばらくして、問題の原因を特定することができました。生成されたログが大きすぎました。実行中のプロセスからコメントした後Console.WriteLine、すべてが正常に機能しました。

プロセスをどのように開始したかを明確にするためだけに:

Process process = new Process();
process.StartInfo.FileName = path;
process.StartInfo.Arguments = arguments;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.EnableRaisingEvents = true;
process.Exited += Process_Exited;
process.Start();

そして、私がそれをどのように処理したかは出口です:

private static void Process_Exited(object sender, EventArgs e)
{
    Process process = (Process)sender;
    File.WriteAllText(path, process.StandardOutput.ReadToEnd() +
    "\r\nEXCEPTIONS\r\n" + process.StandardError.ReadToEnd());
}

修正方法はすでに知っていますが、実際に何が起こったのか、そしてその理由を知りたいのです。好きなだけ大きなログを作成する方法が必要だからです。

4

1 に答える 1

9

The documentation for RedirectStandardOutput describes not one, but two possible deadlock scenarios (how's that for a useful and non-dangerous class library?!)

One occurs when both StandardOutput and StandardError are both redirected, and when the stream being read is full. This seems to perfectly describe your situation.

A pretty annoying situation, but read the full documentation and they describe how to avoid it occurring.

于 2013-05-01T21:00:04.373 に答える