2012-09-26 67 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

我相信的確是發生了什麼!答案在文件中,對我很恥辱。謝謝回覆! –