2012-09-26 25 views
6

今天我遇到了这个问题,花了我相当长的一段时间才弄明白。我从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()); 
} 

即使我已经知道如何解决它,我还是喜欢知道发生了什么事以及为什么,因为我必须有一种方法来创建一个尽可能大的日志。

回答

7

documentation for RedirectStandardOutput描述不是一个,而是两个可能的死锁情况(是如何形成的一个有用的和非危险类库?!)当两个StandardOutput和StandardError的都被重定向

一发生,而当流之中阅读已满。这似乎很好地描述了你的情况。

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

+2

我相信的确是发生了什么!答案在文件中,对我很耻辱。谢谢回复! –