我需要從C#應用程序運行外部進程,但在繼續執行之前等待它返回。同時,我需要從stdout獲取並更新包含進度信息的文本框。由於該命令可能會在此期間運行幾分鐘並打印信息,因此顯示該信息是絕對必要的;但多個命令可能會運行,並且必須按順序,所以等待也是如此。C#在讀取異步時等待shell命令返回
我嘗試使用:
p = Process.Start();
p.BeginOutputReadLine();
p.WaitForExit();
但凍結UI線程在等待和防止出現輸出。這:
p.Start();
p.BeginOutputReadLine();
while (!p.HasExited)
{
Application.DoEvents();
Thread.Sleep(100);
}
工作更好,但是完全錯誤/一個壞主意,並沒有實際等待整個期間。
我也簡單地嘗試過使用BackgroundWorker來啓動shell進程,但我不確定如何讓UI線程等待而不會阻止工作者完成。
我想要做的是提供一個DialogResult ShellExecute(String cmd)
類似於ShowDialog()
,如果用戶允許該命令完成,單擊取消或命令的返回碼,則返回OK/Cancel(/ fail)結果。它不應該返回,直到命令完成(或取消)。
所有外殼命令與運行:
ProcessStartInfo info = new ProcessStartInfo
{
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
FileName = "cmd.exe",
Arguments = "/c " + command
};
重定向輸出和有效外殼執行該命令。
我該如何正確地創建一個啓動異步進程的函數,但仍然等待直到完成返回?
顯然,如果你想捕捉標準錯誤的數據,你必須重複練習與p.ErrorDataReceievd + =的ErrorHandler – 2011-12-21 17:31:53
這並不妨礙該函數創建並返回從啓動過程。我的輸出成功重定向,我更專注於等待無阻塞。 – ssube 2011-12-21 17:50:24