簡體   English   中英

異步使用System.Diagnostics.Process,在確定退出之前,我應該如何確保收到最后一個輸出?

[英]Using System.Diagnostics.Process asynchronously, how should I ensure that I've received the last output before determining it has exited?

考慮這個例子C#代碼(不相關的部分遺漏):

using System.Diagnostics.Process;

var process = new Process();
var startInfo = process.StartInfo;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
process.EnableRaisingEvents = true;
process.OutputDataReceived += OutputHandler;
process.ErrorDataReceived += ErrorHandler;
process.Exited += ExitHandler;
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();

現在,我想通知一個監聽器,在沒有更多的輸出(stdout / stderr)從它讀取之后 ,該進程已經完成。 在確定進程是否真正完成之前,我如何在ExitHandler方法中確保OutputHandlerErrorHandler處理所有剩余的stdout / stderr?

顯式使用Process.WaitForExit(-1)時有一個互鎖。 在stdout和stderr的異步讀取器指示文件結束狀態之前,它不會返回。 在您的退出事件處理程序中調用它。 您必須使用-1的超時,否則將無效。 或者只是WaitForExit()。 哪個好,你知道它已經退出了。

當進程中止或終止時,將調用Exited事件。 因此,應該永遠不會存在仍然需要讀取數據的情況。

當操作系統關閉進程時,將通知正在等待退出的任何進程組件。 然后,組件可以使用它對進程具有的句柄來訪問仍駐留在操作系統內存中的關聯進程信息(例如ExitTime屬性)。

由於關聯的進程已退出,因此組件的Handle屬性不再指向現有的進程資源。 相反,它只能用於訪問操作系統有關進程資源的信息。 系統知道Process組件尚未釋放的退出進程的句柄,因此它將ExitTime和Handle屬性信息保留在內存中,直到Process組件專門釋放資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM