C# BackgroundWorker的使用

2024-02-06 10:52

本文主要是介绍C# BackgroundWorker的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C# 中的 BackgroundWorker 类是 .NET Framework 提供的一个组件,用于在后台线程上异步执行长时间运行的操作,同时保持与用户界面(UI)的交互,如更新进度信息或处理取消请求。这使得可以轻松地在不冻结UI的情况下执行耗时的任务。

以下是如何在 C# 中使用 BackgroundWorker 的基本步骤:

  1. 初始化 BackgroundWorker: 在窗体加载或者其他合适的地方创建一个 BackgroundWorker 实例,并设置其属性。

    private BackgroundWorker backgroundWorker = new BackgroundWorker();// 在构造函数或Form_Load事件中初始化
    public Form1()
    {InitializeComponent();InitializeBackgroundWorker();
    }private void InitializeBackgroundWorker()
    {// 允许报告进度backgroundWorker.WorkerReportsProgress = true;// 允许在后台任务执行过程中取消操作backgroundWorker.WorkerSupportsCancellation = true;// 为DoWork、ProgressChanged和RunWorkerCompleted事件添加事件处理器backgroundWorker.DoWork += bgWorker_DoWork;backgroundWorker.ProgressChanged += bgWorker_ProgressChanged;backgroundWorker.RunWorkerCompleted += bgWorker_WorkerCompleted;
    }
  2. 定义 DoWork 事件处理程序: 这是在后台线程上实际执行工作的位置。通过调用 ReportProgress() 方法可以发送进度信息到主线程。

    private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
    {BackgroundWorker worker = sender as BackgroundWorker;for (int i = 1; i <= 100; i++){if (worker.CancellationPending) // 检查是否收到取消请求{e.Cancel = true;break;}else{// 执行耗时操作var result = PerformSomeLongRunningOperation(i);// 如果允许报告进度,则报告当前进度worker.ReportProgress(i, result);// 可能需要在此处模拟延迟,例如 Thread.Sleep(100);}}
    }
  3. 定义 ProgressChanged 事件处理程序: 当 ReportProgress() 被调用时,这个事件会触发,用来更新 UI 上的进度条或其他进度指示器。

    private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {int progressPercentage = e.ProgressPercentage;string message = e.UserState as string; // 如果传递了其他数据// 更新进度条控件progressBar.Value = progressPercentage;// 或者显示消息labelProgress.Text = $"已完成 {progressPercentage}%";
    }
  4. 定义 RunWorkerCompleted 事件处理程序: 当后台任务完成(成功、失败或被取消)时,此事件将触发,可以在这里进行清理工作或者通知用户操作已完成。

    private void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {if (e.Cancelled){MessageBox.Show("操作已取消");}else if (e.Error != null){MessageBox.Show($"后台工作遇到错误: {e.Error.Message}");}else{MessageBox.Show("后台工作已完成!");// 此处可以获取后台任务的结果(如果有),例如:var result = e.Result;}// 恢复之前禁用的界面元素buttonStart.Enabled = true;buttonCancel.Enabled = false;
    }
  5. 启动 BackgroundWorker: 在按钮点击事件或其他触发点调用 RunWorkerAsync() 来开始执行后台任务。

    private void buttonStart_Click(object sender, EventArgs e)
    {// 禁止再次点击直到后台任务完成buttonStart.Enabled = false;buttonCancel.Enabled = true;// 启动后台任务并可选择性传递参数backgroundWorker.RunWorkerAsync();
    }
  6. 取消 BackgroundWorker: 如果支持取消,在取消按钮的点击事件中调用 CancelAsync() 方法来请求取消后台任务。

    private void buttonCancel_Click(object sender, EventArgs e)
    {backgroundWorker.CancelAsync();
    }

以上就是一个典型的 BackgroundWorker 使用示例,注意实际应用中根据具体需求调整代码。

 

虽然 .NET Framework 和 .NET Core/.NET 5 及更高版本依然支持 BackgroundWorker,但在现代开发中更倾向于使用 Task 和 async/await 关键字来实现异步编程,或者使用 IProgress<T> 接口结合 async 方法来报告进度。

请注意,使用BackgroundWorker时,要确保任务是可中断的,因为它是在一个单独的线程中执行的。如果任务需要连续执行,可能需要特殊的处理。

 

这篇关于C# BackgroundWorker的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/684085

相关文章

Java中Runnable和Callable的区别和联系及使用场景

《Java中Runnable和Callable的区别和联系及使用场景》Java多线程有两个重要的接口,Runnable和Callable,分别提供一个run方法和call方法,二者是有较大差异的,本文... 目录一、Runnable使用场景二、Callable的使用场景三、关于Future和FutureTa

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

详解如何使用Python提取视频文件中的音频

《详解如何使用Python提取视频文件中的音频》在多媒体处理中,有时我们需要从视频文件中提取音频,本文为大家整理了几种使用Python编程语言提取视频文件中的音频的方法,大家可以根据需要进行选择... 目录引言代码部分方法扩展引言在多媒体处理中,有时我们需要从视频文件中提取音频,以便进一步处理或分析。本文

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom

使用mvn deploy命令上传jar包的实现

《使用mvndeploy命令上传jar包的实现》本文介绍了使用mvndeploy:deploy-file命令将本地仓库中的JAR包重新发布到Maven私服,文中通过示例代码介绍的非常详细,对大家的学... 目录一、背景二、环境三、配置nexus上传账号四、执行deploy命令上传包1. 首先需要把本地仓中要

Spring Cloud之注册中心Nacos的使用详解

《SpringCloud之注册中心Nacos的使用详解》本文介绍SpringCloudAlibaba中的Nacos组件,对比了Nacos与Eureka的区别,展示了如何在项目中引入SpringClo... 目录Naacos服务注册/服务发现引⼊Spring Cloud Alibaba依赖引入Naco编程s依