C# BackgroundWorker组件学习html
一个程序中须要进行大量的运算,而且须要在运算过程当中支持用户必定的交互,为了得到更好的用户体验,使用BackgroundWorker来完成这一功能. 数据库
BackgroundWorker类容许您在单独的专用线程上运行操做。 耗时的操做(以下载和数据库事务)在长时间运行时可能会致使用户界面 (UI) 彷佛处于中止响应状态。编程
若是您须要能进行响应的用户界面,并且面临与这类操做相关的长时间延迟,则可使用 BackgroundWorker类方便地解决问题(MSDN)。 app
若要在后台执行耗时的操做,请建立一个 BackgroundWorker,侦听那些报告操做进度并在操做完成时发出信号的事件。 能够经过编程方式建立 BackgroundWorker,异步
也能够将它从“工具箱”的“组件”选项卡中拖到窗体上。 若是在 Windows 窗体设计器中建立 BackgroundWorker,则它会出如今组件栏中,并且它的属性会显示在“属性”窗async
口中(MSDN)。ide
属性:工具
IsBusy:获取一个值,指示 BackgroundWorker 是否正在运行异步操做。学习
WorkerReportsProgress: 获取或设置一个值,该值指示 BackgroundWorker 可否报告进度更新。ui
WorkerSupportsCancellation: 获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。
事件:
DoWork: 调用 RunWorkerAsync 时发生。
ProgressChanged: 调用 ReportProgress 时发生。
RunWorkerCompleted: 当后台操做已完成、被取消或引起异常时发生。
实例:
窗体设计以下图:
代码实现:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.WorkerSupportsCancellation = true; } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; for (int i = 1; i <= 12; i++) { if (worker.CancellationPending == true) { e.Cancel = true; break; } else { System.Threading.Thread.Sleep(500); worker.ReportProgress(i * 10); } } } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { lbResult.Text = (e.ProgressPercentage.ToString() + "%"+e.UserState); } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled == true) { lbResult.Text = "Canceled!"; } else if (e.Error != null) { lbResult.Text = "Error: " + e.Error.Message; } else { lbResult.Text = "Done!"; } } private void btnStartAsync_Click(object sender, EventArgs e) { if (backgroundWorker1.IsBusy != true) { backgroundWorker1.RunWorkerAsync(); } } private void btnCancelAsync_Click(object sender, EventArgs e) { if (backgroundWorker1.WorkerSupportsCancellation == true) { backgroundWorker1.CancelAsync(); } } } }
运行结果: