BackgroundWorker控件使用记录
C#之BackgroundWorker从简单入门到深入精通的用法总结
有些操作在长时间运行时会导致用户界面 (UI) 处于停止响应状态,用户在这操作期间无法进行其他的操作,造成非常差的用户体验,为了不使UI层处于停止响应状态,则可以使用 BackgroundWorker 类方便地解决这类问题。这个后台的线程处理,可以很好的实现常规操作的同时,还可以及时通知UI当前处理信息的进度等。
可以通过在winform的工具箱中拖入BackgroundWorker,也可以采用编程的方式,本文采用前者方式。
若要为后台操作做好准备,请添加 DoWork 事件的事件处理程序。 在此事件处理程序中调用耗时的操作。
若要开始此操作,请调用 RunWorkerAsync;
若要收到进度更新的通知,请处理 ProgressChanged 事件,并通过调用ReportProgress方法来引发ProgressChanged 事件;
若要在操作完成时收到通知,请处理 RunWorkerCompleted 事件。
需要注意:由于DoWork事件内部的代码运行在非UI线程之上,确保在 DoWork 事件处理程序中不操作任何用户界面对象。 而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;
namespace TestWinform
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true; //指示BackgroundWorker是否报告进度更新
backgroundWorker1.WorkerSupportsCancellation = true; //是否支持去取消
}
/// <summary>
/// 开始按钮
/// </summary>
/// <param name = "sender"> </param>
/// <param name = "e"> </param>
private void button1_Click(object sender, EventArgs e)
{
if (!backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync(); //开始执行后台操作
}
}
/// <summary>
/// 停止按钮
/// </summary>
/// <param name = "sender"> </param>
/// <param name = "e"> </param>
private void button2_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync(); //请求取消后台操作
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (var i = 0; i <= 100; i++)
{
if (backgroundWorker1.CancellationPending) //是否已请求后台取消操作
{
e.Cancel = true;
break;
}
backgroundWorker1.ReportProgress(i); //引发 ProgressChanged 事件。
Thread.Sleep(100);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage; //获取异步任务的进度百分比
label1.Text = @"已完成:" + e.ProgressPercentage + @"%";
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
label1.Text = "后台操作结束";
}
}
}