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

RedirectStandardOutput的文档描述的不是一个,而是两个可能的死锁场景(对于一个有用且不危险的类库来说,这如何?!)

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

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

于 2013-05-01T21:00:04.373 回答