当前位置:首页 > 开发 > C# > 正文内容

C# BackgroundWorker的例子

C#4个月前 (12-23)

以下是一个使用 BackgroundWorker 组件在 C# 中实现后台执行任务,同时在主线程更新 UI(例如显示任务进度等)的示例。在这个示例中,模拟一个耗时的任务(比如计算从 1 累加到一个较大的数),并实时展示进度。

1. 创建 Windows Forms 应用程序项目(以 Windows Forms 为例来展示 UI 交互,如果是控制台应用等也可类似调整思路)

在 Visual Studio 中创建一个新的 Windows Forms 应用程序项目,默认会生成一个包含 Form1.cs 等文件的项目结构。

2. 设计界面(简单添加几个控件用于展示和交互)

在 Form1 的设计视图中添加以下控件:

Button:用于触发后台任务开始,将其 Text 属性设置为 "开始计算"。

ProgressBar:用来展示后台任务的进度,将其 Minimum 属性设为 0,Maximum 属性设为 100(代表进度的 0% - 100% 范围)。

Label:用于显示一些提示信息,比如任务完成后的结果等。

3. 编写代码实现后台任务逻辑及 UI 更新

以下是 Form1.cs 文件中的完整代码示例:

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace BackgroundWorkerExample
{
    public partial class Form1 : Form
    {
        private BackgroundWorker backgroundWorker;

        public Form1()
        {
            InitializeComponent();
            // 初始化BackgroundWorker实例
            backgroundWorker = new BackgroundWorker();
            // 设置支持报告进度
            backgroundWorker.WorkerReportsProgress = true;
            // 设置支持取消操作(这里示例暂未详细体现取消逻辑,可自行扩展)
            backgroundWorker.WorkerSupportsCancellation = true;
            // 绑定DoWork事件处理方法,该方法中执行实际的后台任务
            backgroundWorker.DoWork += BackgroundWorker_DoWork;
            // 绑定ProgressChanged事件处理方法,用于更新UI上的进度条等展示进度的控件
            backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged;
            // 绑定RunWorkerCompleted事件处理方法,用于在任务完成后做一些收尾工作,比如显示最终结果等
            backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (!backgroundWorker.IsBusy)
            {
                // 重置进度条
                progressBar1.Value = 0;
                // 启动后台任务
                backgroundWorker.RunWorkerAsync(100000);  // 这里传入一个较大的数,模拟耗时任务(计算1到这个数的累加)
            }
        }

        private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            // 获取传入的参数(这里就是要累加到的那个数)
            int n = (int)e.Argument;
            intsum = 0;
            for (int i = 1; i <= n; i++)
            {
                sum ++ i;
                // 计算进度百分比并报告进度,这里简单按已累加的数与总数的比例来算进度
                int progressPercentage = (int)((double)i / n * 100);
                backgroundWorker.ReportProgress(progressPercentage);
            }
            e.Result = sum;  // 将计算结果存储到DoWorkEventArgs的Result属性中,方便后续获取
        }

        private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            // 更新进度条的进度值
            progressBar1.Value = e.ProgressPercentage;
            // 也可以在这里更新其他UI控件来展示进度相关信息,比如在Label中显示当前进度百分比
            label1.Text = $"当前进度: {e.ProgressPercentage}%";
        }

        private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                // 如果没有错误,显示最终的计算结果
                label1.Text = $"计算完成,结果为: {e.Result}";
            }
            else
            {
                // 如果出现错误,显示错误信息
                label1.Text = $"出现错误: {e.Error.Message}";
            }
        }
    }
}

在上述代码中:

  • 初始化 BackgroundWorker 及绑定事件处理方法:

在 Form1 的构造函数中,创建 BackgroundWorker 实例,并设置 WorkerReportsProgress 为 true(表示支持报告进度),WorkerSupportsCancellation 为 true(支持取消操作,示例中暂未详细体现取消逻辑,可自行扩展)。然后分别绑定 DoWork(执行后台任务)、ProgressChanged(更新 UI 进度展示)、RunWorkerCompleted(任务完成后的收尾工作)这三个关键事件的处理方法。

  • 触发后台任务开始:

当点击界面上的 “开始计算” 按钮时,先判断 BackgroundWorker 是否正在忙碌(IsBusy 属性判断),如果不忙,就重置进度条,然后通过 RunWorkerAsync 方法启动后台任务,并传入一个参数(这里模拟传入一个较大的数用于计算从 1 累加到这个数的耗时任务)。

  • 执行后台任务(DoWork 事件处理):

在 BackgroundWorker_DoWork 方法中,获取传入的参数,然后通过循环进行累加计算。在每次循环中,计算当前的进度百分比,并通过 ReportProgress 方法向主线程报告进度,同时将最终的计算结果存储到 DoWorkEventArgs 的 Result 属性中,方便后续获取。

  • 更新 UI 展示进度(ProgressChanged 事件处理):

在 BackgroundWorker_ProgressChanged 方法中,根据接收到的进度百分比更新进度条的 Value 属性,还可以在这里更新其他 UI 控件(如示例中更新 Label 的文本显示当前进度百分比)来展示进度相关信息。

  • 任务完成后的处理(RunWorkerCompleted 事件处理):

在 BackgroundWorker_RunWorkerCompleted 方法中,判断是否有错误发生,如果没有错误,就从 e.Result 中获取计算结果并在 Label 中显示最终的计算结果;如果出现错误,则显示相应的错误信息。

这样就利用 BackgroundWorker 实现了一个简单的后台执行任务并实时更新 UI 展示进度的示例,你可以根据实际需求对后台任务的具体逻辑以及 UI 展示等进行调整和扩展。

请注意,如果是在控制台应用程序等非 Windows Forms 环境中使用 BackgroundWorker,部分与 UI 更新相关的代码(如操作进度条、标签等控件)需要进行相应调整或者去除,重点关注后台任务执行及进度报告等核心逻辑即可。


转载请注明出处。

本文链接:http://pythonopen.com/?id=1623

相关文章

C# protected

官方:只有在通过派生类类型发生访问时,基类的受保护成员在派生类中才是可访问的。 简单理解:...

C# XML

创建    XmlDocument xmlDoc ...

C#一些重写

        pr...

C# 请确保您的 Main 函数带有 STAThreadAttribute 标记。”

System.Threading.ThreadStateException:“在可以调用 OLE 之...

在 C# 中实现类似于 Windows 资源管理器的“名称”排序方式

要在 C# 中实现类似于 Windows 资源管理器的“名称”排序方式,你需要考虑以下几点:1. 不...

C# BackgroundWorker

1.概述BackgroundWorker是一个在 WinForms 应用程序中用于简化在后台线程执行...