BackgroundWorker 类
示例
下面的代码示例演示 类的 BackgroundWorker 基础知识,这些基础知识用于异步执行耗时的操作。 下图显示了输出的示例。

若要尝试此代码,请创建Windows 窗体应用程序。 添加名为 Label 的resultLabel控件,添加名为 progressBar1的progressBar1控件,并添加两Button个名为 和 cancelAsyncButton的startAsyncButton控件。 为这两个按钮创建 Click 事件处理程序。 在工具箱的“ 组件 ”选项卡中,添加名为 BackgroundWorker 的 backgroundWorker1组件。 为 BackgroundWorker创建 DoWork、 ProgressChanged和 RunWorkerCompleted 事件处理程序。 在窗体的代码中,将现有代码替换为以下代码。
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace BackgroundWorkerSimple
{
// 主窗体类,继承自Windows.Forms.Form
public partial class Form1 : Form
{
// 构造函数,初始化窗体
public Form1()
{
// 初始化窗体上的控件(由设计器自动生成)
InitializeComponent();
// 启用后台工作器的进度报告功能
// 只有设置为true,才能在后台线程中调用ReportProgress方法
backgroundWorker1.WorkerReportsProgress = true;
// 启用后台工作器的取消支持
// 设置为true后,才能通过CancelAsync方法取消后台操作
backgroundWorker1.WorkerSupportsCancellation = true;
// 初始化进度条
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
progressBar1.Value = 0;
}
// "开始异步操作"按钮的点击事件处理方法
private void startAsyncButton_Click(object sender, EventArgs e)
{
// 检查后台工作器是否正在运行
// 避免重复启动多个后台任务
if (backgroundWorker1.IsBusy != true)
{
// 重置进度条和标签
progressBar1.Value = 0;
resultLabel.Text = "开始处理...";
// 启动后台异步操作
// 此方法会触发DoWork事件,在后台线程中执行耗时操作
backgroundWorker1.RunWorkerAsync();
}
}
// "取消异步操作"按钮的点击事件处理方法
private void cancelAsyncButton_Click(object sender, EventArgs e)
{
// 检查后台工作器是否支持取消操作
if (backgroundWorker1.WorkerSupportsCancellation == true)
{
// 发出取消请求
// 此方法会将CancellationPending属性设为true,但不会立即终止后台操作
backgroundWorker1.CancelAsync();
}
}
// DoWork事件处理方法:后台线程执行耗时操作的地方
// 注意:此方法在非UI线程中执行,不能直接操作UI控件
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// 将sender转换为BackgroundWorker实例,便于调用其方法和属性
BackgroundWorker worker = sender as BackgroundWorker;
// 模拟一个包含10个步骤的耗时操作
for (int i = 1; i <= 10; i++)
{
// 检查是否有取消请求
if (worker.CancellationPending == true)
{
// 标记操作已取消
e.Cancel = true;
// 退出循环,终止后台操作
break;
}
else
{
// 模拟耗时操作:暂停500毫秒
System.Threading.Thread.Sleep(500);
// 报告当前进度(0-100之间的百分比)
// 此方法会触发ProgressChanged事件,在UI线程中更新进度
worker.ReportProgress(i * 10);
}
}
}
// ProgressChanged事件处理方法:更新操作进度
// 此方法在UI线程中执行,可以安全地操作UI控件
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// 更新进度条
progressBar1.Value = e.ProgressPercentage;
// 更新标签文本以显示当前进度百分比
resultLabel.Text = $"{e.ProgressPercentage}%";
}
// RunWorkerCompleted事件处理方法:处理后台操作的结果
// 此方法在UI线程中执行,在后台操作完成(包括正常完成、被取消或出错)后触发
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// 根据后台操作的结果更新UI
if (e.Cancelled == true)
{
// 操作被取消
resultLabel.Text = "已取消!";
}
else if (e.Error != null)
{
// 操作过程中发生错误
resultLabel.Text = $"错误:{e.Error.Message}";
}
else
{
// 操作正常完成
resultLabel.Text = "完成!";
}
}
}
}
文章目录
文章作者:hujiato
文章标题:BackgroundWorker 类
文章链接:https://www.xbaoku.top/?post=16
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明来自hujiato !
文章标题:BackgroundWorker 类
文章链接:https://www.xbaoku.top/?post=16
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明来自hujiato !
设备上扫码阅读