BackgroundWorker是在內部使用了線程池的技術;同時,在Winform 或WPF編碼中,它還給工做線程和UI線程提供了交互的能力。html
Thread和ThreadPool默認都沒有提供這種交互能 力,而BackgroundWorker卻經過事件提供了這種能力。這種能力包括:報告進度、支持完成回調、取消任務、暫停任務等。app
通常而言,無特殊須要的,優先考慮使用標準的backgroundworker
再加上線程池,多數問題都能應付了
只有特別須要精確控制或性能的才用thread異步
BackgroundWorker會在主線程以外,另開一個後臺線程,性能
咱們能夠把一些處理放在後臺線程中處理,完成以後,後臺線程會把結果傳遞給主線程,同時結束本身。this
若是要顯示進度,好比咱們但願走馬燈式更新label,就要把 bw.WorkerReportsProgress = true;編碼
若是要支持中途取消, 則把bw.WorkerSupportsCancellation = true; spa
private void button3_Click(object sender, EventArgs e) { using (BackgroundWorker bw = new BackgroundWorker()) { bw.WorkerReportsProgress = true; bw.ProgressChanged += bw_ProgressChanged; bw.RunWorkerCompleted += bw_RunWorkerCompleted; bw.DoWork += bw_DoWork; //容許用戶指定顯示數據的範圍呢!因此須要把100做爲參數傳遞給計算過程 bw.RunWorkerAsync(100); } } //這時返回了主線程,因此能夠直接使用UI控件了 void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) { //修改進度條的顯示。 //this.progressBarSum.Value = e.ProgressPercentage; //若是有更多的信息須要傳遞,能夠使用 e.UserState 傳遞一個自定義的類型。 //這是一個 object 類型的對象,您能夠經過它傳遞任何類型。 //咱們僅把當前 sum 的值經過 e.UserState 傳回,並經過顯示在窗口上。 string message = e.UserState.ToString(); label1.Text = message; } //e.Argument=bw.RunWorkerAsync("Hello World")的參數 void bw_DoWork(object sender, DoWorkEventArgs e) { System.Diagnostics.Debug.WriteLine("bw_DoWork"); BackgroundWorker bgWorker = sender as BackgroundWorker; //這裏的操做是在另外一個線程上完成的,不該該操做UI //在這裏執行耗時的運算。 int endNumber = 0; if (e.Argument != null) { endNumber = (int)e.Argument; } for (int i = 0; i <= endNumber; i++) { bgWorker.ReportProgress(i, "current num:" + i.ToString()); Thread.Sleep(50); //爲了方便演示 } } //這時後臺線程已經完成,並返回了主線程,因此能夠直接使用UI控件了 void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { System.Diagnostics.Debug.WriteLine("bw_RunWorkerCompleted"); if (e.Error == null) lblMsg.Text = "正常結束"; else lblMsg.Text = "異常結束"+ e.Error.Message; }
參考: http://www.javashuo.com/article/p-gcumjlcm-cw.html線程
https://www.cnblogs.com/luminji/archive/2011/05/13/2044801.htmlcode
https://www.cnblogs.com/happy555/archive/2007/11/07/952315.htmlorm
https://www.cnblogs.com/grenet/archive/2011/12/21/2289014.html
我所知道的.NET異步 https://www.cnblogs.com/scy251147/archive/2012/03/03/2378477.html
支持暫停操做的Backgroundworker https://www.cnblogs.com/chenxizhang/archive/2010/03/13/1685209.html