«

BackgroundWorker 类

hujiato 发布于 阅读:89 编程


示例

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

BackgroundWorker 简单示例

若要尝试此代码,请创建Windows 窗体应用程序。 添加名为 Label 的resultLabel控件,添加名为 progressBar1progressBar1控件,并添加两Button个名为 和 cancelAsyncButtonstartAsyncButton控件。 为这两个按钮创建 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 = "完成!";
            }
        }
    }
}

 

C#

文章目录