当重定向输出相对较大时,启动进程挂起

时间:2012-09-26 22:21:34

标签: c# asp.net iis process redirectstandardoutput

我今天遇到了这个问题,我花了很长时间才搞清楚。我从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());
}

即使我已经知道如何修复它,我仍然想知道究竟发生了什么以及为什么,因为我必须有办法创建一个我想要的大日志。

1 个答案:

答案 0 :(得分:8)

documentation for RedirectStandardOutput描述的不是一个,而是两个可能的死锁场景(对于一个有用且非危险的类库,怎么样?!)

当StandardOutput和StandardError都被重定向,并且正在读取的流已满时,会发生一个错误。这似乎完美地描述了你的情况。

非常烦人的情况,但阅读完整的文档,他们描述了如何避免它发生。