[英]Process.Start in BackgroundWorker C#
我遇到了最糟糕的時光,把我的頭纏在線程/后台進程上。 在某種程度上,我的問題似乎很普遍,但是我還沒有找到可以滿足我需求的好例子。
經典示例如下所示:
當某個長時間運行的任務/進程運行時,我的UI凍結-我希望至少能夠移動/最小化UI。
經典答復包括線程和任務工廠以及BackgroundWorker解決方案。 但是,無論我如何實施它們,我都會得到糟糕的結果。
在我的程序中,我正在執行另一個應用程序並等待其完成。 為了簡單起見,假設我這樣做是這樣的:
Process p = Process.Start("notepad.exe somefile.txt");
p.WaitForExit();
//read somefile.txt
顯然,在WaitForExit()
磨掉等待我關閉記事本時,我的應用程序UI將掛起。
我嘗試了一些建議的方法來解決這個問題,但是我陷入了兩個角落之一:
我看到的大多數示例都涉及大量計數-簡單但不完全是我正在做的事情。 取消此“外部”過程會使事情變得有些復雜。
感謝您的時間和考慮!!
BackgroundWorker在這里似乎很合適。 應該按照以下方式進行配置:
var worker = new BackgroundWorker();
worker.WorkerReportsProgress = false;
worker.WorkerSupportsCancellation = false;
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync();
然后有處理程序:
void worker_DoWork(object sender, DoWorkEventArgs e)
{
//start notepad process here.
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//read somefile.txt here.
}
從事情的聲音來看,您的應用程序未在單獨的線程上運行Process.WaitForExit
調用,否則不會掛起。
BackgroundWorker
, Thread
和ThreadPool
都是有用的工具,但是使用它們並使其變得困難和麻煩,帶有System.Threading.Task
的Task Parallel庫在某種程度上已“取代”了使用線程來直接執行您需要執行的大多數操作異步地。
請參閱: 線程和C#中的新Task庫
這樣您的代碼就變成了。
Task.Factory.StartNew(() =>
{
var proc = new Process("...");
proc.WaitForExit();
File.Read("...");
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.