下面是C#代碼我使用的是推出一個子進程並監控其輸出:C#:讀取子進程標準輸出塊,直到另一個子進程結束?
using (process = new Process()) {
process.StartInfo.FileName = executable;
process.StartInfo.Arguments = args;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
using (StreamReader sr = process.StandardOutput) {
string line = null;
while ((line = sr.ReadLine()) != null) {
processOutput(line);
}
}
if (process.ExitCode == 0) {
jobStatus.State = ActionState.CompletedNormally;
jobStatus.Progress = 100;
} else {
jobStatus.State = ActionState.CompletedAbnormally;
}
OnStatusUpdated(jobStatus);
}
我推出多個子進程在不同的線程池線程(但不超過四個的時間,在一個四核核心機器)。這一切工作正常。
我遇到的問題是我的一個子進程將退出,但對sr.ReadLine()
的相應調用將阻塞,直到另一個子進程退出。我不確定它會返回什麼,但是這不應該發生,除非我缺少某些東西。
沒有任何關於我的子過程會導致他們以任何方式「鏈接」 - 他們不相互溝通。當發生這種情況時,我甚至可以查看任務管理器/進程資源管理器,並看到我的子進程已經退出,但標準輸出上的ReadLine()
調用仍然被阻止!
我已經能夠通過將輸出監控代碼旋轉到新線程並執行process.WaitForExit()
來解決此問題,但這看起來很奇怪。任何人都知道這裏發生了什麼?
這是它應該工作的方式。任何阻止調用在他們的任務不再相關時都不會解鎖的設計對我來說似乎是瘋了。在我的情況下,孩子結束了,但父母並沒有從阻止的呼叫中醒來。它看起來像某處有一個錯誤。 – jnylen 2010-10-29 21:04:28