这篇文章写得很好 C# BackgroundWorker 详解,一步一步描述很清楚
1、添加控件
backgroundWorker1 组件
label1、label2 用于显示过程和结果信息
progressBar1 显示后台处理进度
button1 用于取消后台操作
2、详细代码
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;
using System.Reflection;
using System.Threading;
namespace DemoCSDN
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
progressBar1.Maximum = 100;
backgroundWorker1.RunWorkerAsync(100);//调用RunWorkerAsync方法启动计算过程,其实这个方法可以接受一个 object 类型的参数。通过它我们就可以把任何数据传递给计算过程
backgroundWorker1.WorkerReportsProgress = true;//允许我们在执行计算的过程中给UI线程发送消息
backgroundWorker1.WorkerSupportsCancellation = true;//支持用户取消操作
}
//执行计算的过程中给UI线程发送消息
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//修改进度条的显示。
progressBar1.Value = e.ProgressPercentage;
//如果有更多的信息需要传递,可以使用 e.UserState 传递一个自定义的类型。
//这是一个 object 类型的对象,您可以通过它传递任何类型。
//我们仅把当前 sum 的值通过 e.UserState 传回,并通过显示在窗口上。
string message = e.UserState.ToString();
label1.Text = message;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bgWorker = sender as BackgroundWorker;
int endNumber = 0;
if (e.Argument != null)
{
endNumber = (int)e.Argument;
}
int sum = 0;
for (int i = 0; i <= endNumber; i++)
{
sum += i;
string message = "Current sum is: " + sum.ToString();
//ReportProgress 方法把信息传递给 ProcessChanged 事件处理函数。
//第一个参数类型为 int,表示执行进度。
//如果有更多的信息需要传递,可以使用 ReportProgress 的第二个参数。
//这里我们给第二个参数传进去一条消息。
bgWorker.ReportProgress(i, message);
Thread.Sleep(100);
//在操作的过程中需要检查用户是否取消了当前的操作。
if (bgWorker.CancellationPending == true)
{
e.Cancel = true;
break;
}
}
//如果想要拿到 e.Result,您需要在DoWork方法中设置 e.Result属性
e.Result = sum;
}
//如果检测到用户点击的取消按钮,就退出当前的计算过程。下面是点击取消按钮时要调用的代码:
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
}
/*如果在计算过程中发生了异常该怎么处理?有没有办法知道计算过程已经结束?当然要有,即便是正常的结束也需要拿到计算的结果。
*通过这个事件我们可以进行一些运算结束后的操作,比如禁用取消按钮,异常处理,结果显示等。*/
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//如果用户取消了当前操作就关闭窗口。
if (e.Cancelled)
{
this.Close();
}
//计算已经结束,需要禁用取消按钮。
this.button1.Enabled = false;
//计算过程中的异常会被抓住,在这里可以进行处理。
if (e.Error != null)
{
Type errorType = e.Error.GetType();
switch (errorType.Name)
{
case "ArgumentNullException":
case "MyException":
//do something.
break;
default:
//do something.
break;
}
}
//计算结果信息:e.Result
//use it do something.
label2.Text = "完成 sum:" + e.Result.ToString();
}
}
}
3、界面显示