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