C#学习笔记之BackGroundWorder using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BackGroundWorder组件控件
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// BackGroundWorker是.NET里用来执行多线程的控件,它允许程序员在单独的一个线程里
/// 执行一些操作。耗时的操作(比如下载和数据库事务)在长时间运行时可能会导致用户界面
/// 始终处于“未响应”状态。
///
/// 该控件有三个事件:DoWork、ProgressChanged、RunWorkerCompleted。
/// 在程序中调用 RunWorkerAsync() 方法则会启动 DoWork 事件;当在事件处理过程中,调用
/// ReportProgress() 方法则会启动 ProgressChanged 事件;而当 DoWork 事件处理完成时
/// 则会触发 RunWorkerCompleted 事件。
///
/// 注意:如果在 DoWork 事件中操作任何用户界面对象,界面仍然会出现“未响应”;应该在事件
/// ProgressChanged 和 RunWorkerCompleted 中和窗体进行通信。
/// </summary>
// 在程序中调用 RunWorkerAsync() 将会触发该事件:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// sender:表示触发该事件的控件对象
// e 有三个属性:Cancel、Argument、Result
// 1、Cancel:DoWork 事件中的代码应定期检查 CancellationPending 属性值,并在该值
// 为 true 时终止操作,true表示应用程序已经请求取消后台操作,此时 Cancel 应设置
// 为 true,同时 RunWorkerCompleted 事件处理程序中的Cancelled也变为 true。
if (backgroundWorker1.CancellationPending == true)
{
e.Cancel = true;
return;
}
// 2、Argument:触发 DoWork 事件的方法 RunWorkerAsync() 有两种重载,一种无参,
// 另一种有一个object类型的参数;当调用有参方法时,e 的 Argument 属性将会指向
// 这个参数。
string str = e.Argument.ToString(); // 获取 RunWorkerAsync() 传递过来的值
for (int i = 1; i <= 100; i++)
{
string strr = "第" + i + "句:" + str;
// 触发 ProgressChanged 事件
backgroundWorker1.ReportProgress(i, strr);
if (i == 50)
{
// 此方法只是请求取消,此处并没有取消。
backgroundWorker1.CancelAsync();
MessageBox.Show("请求取消后台操作!");
if (backgroundWorker1.CancellationPending == true)
{
e.Cancel = true;
MessageBox.Show("后台程序中断!");
return;
}
}
Thread.Sleep(200);
}
// 3、Result:此处将Result设置成什么,RunWorkerCompleted 事件中的Result就是什么。
e.Result = "完美结束!";
}
// 在 DoWork 事件中调用 ReportProgress() 方法就会触发该事件。
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// ReportProgress() 有两种重载:
// void ReportProgress(int persentProgress);
// void ReportProgress(int persentProgress, object userState);
// ReportProgress() 的第一个参数一般用来报告该后台操作完成的进度,可以通过
// ProgressChanged 事件中 e 的 ProgressPersentage 属性来获取。如果还想传递
// 更多的参数,可以使用参数 userState,可以通过事件 e 的 UserState属性来获取。
progressBar1.Value = e.ProgressPercentage;
label1.Text = e.UserState.ToString();
}
// 当 DoWork 事件处理程序结束之后将会触发此事件。
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show("后台程序出错:" + e.Error.Message.ToString());
}
else if (e.Cancelled)
{
MessageBox.Show("后台程序被终止!");
}
else
{
MessageBox.Show("后台程序运行结束!\r\n" + e.Result);
}
}
// 启动后台程序
private void button1_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy)
{
MessageBox.Show("后台程序正在执行!");
}
else
{
// 启动后台程序
backgroundWorker1.RunWorkerAsync("Hello World");
}
backgroundWorker1.WorkerReportsProgress = true; // 设置支持报告进度更新
backgroundWorker1.WorkerSupportsCancellation = true; // 设置支持取消后台操作
}
}
}