2012-02-15 65 views
1

我有以下代碼可以在另一臺服務器上正常工作。問題是這個過程似乎從來沒有進入Exited狀態。被調用的exe創建一個文件作爲最後一步,這個文件確實被創建,但我的代碼似乎永遠不知道該過程已完成。當被手動運行時,被調用的exe也會在10秒內運行。我的代碼如下所示:System.Diagnostics.Process未在代碼中退出

   System.Diagnostics.Process proc = new System.Diagnostics.Process() proc.StartInfo.RedirectStandardOutput = true; 
       proc.StartInfo.RedirectStandardError = true; 
       proc.StartInfo.UseShellExecute = false; 
       proc.StartInfo.CreateNoWindow = true; 
       proc.StartInfo.FileName = exeConf.CMD; 
       proc.StartInfo.Arguments = argString; 
       proc.Start(); 
       proc.WaitForExit(10000); 

       if(proc.HasExited) 
       msgLine = proc.StandardError.ReadToEnd(); 
+0

有關其他過程的更多信息將會有所幫助。 – cadrell0 2012-02-15 17:32:31

回答

1

似乎proc.StandardOutput.ReadToEnd()必須在proc.Start()之後直接調用,否則它可能會造成死鎖。

+0

這沒有意義。因爲在你編譯System.Diagnostics.Process.Start()之後可能沒有任何輸出。 – 2013-04-05 10:06:38

7

請參閱this MSDN文章。

如果父進程在p.StandardOutput.ReadToEnd之前調用p.WaitForExit並且子進程寫入足夠的文本來填充重定向的流,則可能會導致死鎖情況。父進程將無限期地等待子進程退出。子進程將無限期地等待父進程從完整的StandardOutput流中讀取。

+0

當我註釋等待,然後我代碼凍結在這一行:msgLine = proc.StandardError.ReadToEnd(); – NomadicDeveloper 2012-02-15 17:53:32