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时,要确保任务是可中断的,因为它是在一个单独的线程中执行的。如果任务需要连续执行,可能需要特殊的处理。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

003集—三调数据库添加三大类字段——arcgis

在国土管理日常统计工作中经常需要用到三大类数据&#xff08;农用地、建设用地、未利用地&#xff09;&#xff0c;而三调数据库中无三大类字段&#xff0c;因此需要手工录入三大类字段&#xff0c;并根据二级地类代码录入相关三大类名称。本代码可一键录入海量三大类名称统计…

什么是Java中的垃圾回收器,你能解释一下不同种类的垃圾回收算法吗?

什么是Java中的垃圾回收器&#xff0c;你能解释一下不同种类的垃圾回收算法吗&#xff1f; 在Java中&#xff0c;垃圾回收器是一种负责自动管理内存的机制&#xff0c;它负责检测和回收不再使用的对象&#xff0c;释放它们占用的内存空间。垃圾回收器的存在大大简化了程序员对…

数字图像处理(实践篇)四十五 OpenCV-Python 使用ORB算法(包括算法概述)检测图像上的特征点

目录 一 ORB算法 二 涉及的函数 三 实践 ORB: An efficient alternative to SIFT or SURF SIFT 和 SURF 已获得专利,使用需要付费。但是ORB并不需要。ORB 最重要的一点是它来自“

学习总结13

# 最大正方形 ## 题目描述 在一个 n* m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形&#xff0c;输出边长。 ## 输入格式 输入文件第一行为两个整数 n,m(1< n,m< 100)&#xff0c;接下来 n 行&#xff0c;每行 m 个数字&#xff0c;用空格隔开&#xff0…

【日常总结】SourceTree 1.5.2.0 更换用户名称和密码

一、场景 二、问题 三、解决方案 > 方案一&#xff1a;删除缓存文件 > 方案二&#xff1a;更新最新版本&#xff0c;可以直接修改密码&#xff08;推荐&#xff09; 方案一&#xff1a;删除缓存文件 Stage 1&#xff1a;设置显示隐藏文件 Stage 2&#xff1a;打开…

SouthernBiotech重组单克隆二抗

您是否在二抗的使用中遇到以下情况&#xff1a; 亲和力低&#xff0c;非特异性强&#xff1f; 稳定性差&#xff0c;批间差异大&#xff1f; SouthernBiotech(欣博盛生物)新推出重组单克隆二抗可避免出现以上问题&#xff01; 虽然传统多克隆二抗在实验中扮演很重要的角色&a…

linux上部署ftp服务

今天同事让帮忙部署一个ftp服务,以前折腾过几次,不过总会有奇奇怪怪的问题.今天的 话结合chatglm4,整理了一下部署. 在CentOS 7上部署FTP服务&#xff0c;可以使用VSFTP&#xff08;Very Secure FTP Daemon&#xff09;&#xff0c;这是一个安全、快速的FTP服务器。以下是部署F…

070:vue+cesium: 利用canvas设置线性渐变色材质

第070个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置线性渐变色的材质,这里使用canvas的辅助方法。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共104行)专栏目标示例效果 配置方式 1)查看基础…

题解:CF1918D(D. Blocking Elements)

题解&#xff1a;CF1918D&#xff08;D. Blocking Elements&#xff09; 一、 读题 1. 题目链接 &#xff08;1&#xff09; 洛谷链接 洛谷链接 &#xff08;2&#xff09; CF链接 CF链接 2. 题意简述 已知一个长度为 n n n 的数组 a a a&#xff0c;构造一个数组 b…

Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧

技术背景 我们在做Android平台GB28181设备对接模块的时候&#xff0c;遇到这样的技术需求&#xff0c;开发者希望能以后台服务的形式运行程序&#xff0c;国标平台侧没有视频回传请求的时候&#xff0c;仅保持信令链接&#xff0c;有发起视频回传请求或语音广播时&#xff0c;…

数字孪生网络攻防模拟与城市安全演练

在数字化浪潮的推动下&#xff0c;网络攻防模拟和城市安全演练成为维护社会稳定的不可或缺的环节。基于数字孪生技术我们能够在虚拟环境中进行高度真实的网络攻防模拟&#xff0c;为安全专业人员提供实战经验&#xff0c;从而提升应对网络威胁的能力。同时&#xff0c;在城市安…

71.Spring和SpringMVC为什么需要父子容器?

71.Spring和SpringMVC为什么需要父子容器&#xff1f; 就功能性来说不用子父容器也可以完成&#xff08;参考&#xff1a;SpringBoot就没用子父容器&#xff09; 1、所以父子容器的主要作用应该是划分框架边界。有点单一职责的味道。service、dao层我们一般使用spring框架 来…

Qt 进程守护程序

Qt 进程守护程序 简单粗暴的监控&#xff0c;方法可整合到其他代码。 一、windows环境下 1、进程查询函数 processCount函数用于查询系统所有运行的进程中该进程运行的数量&#xff0c;比如启动了5个A进程&#xff0c;该函数查询返回的结果就为5。 windows下使用了API接口查询…

GEE数据集——全球健康地图项目Global Healthsites Mapping Project

Global Healthsites Mapping Project Healthsites.io和全球健康网站绘图项目的使命是帮助向政府、非政府组织和私营部门提供准确的最新健康设施信息。医疗机构登记簿是一个国家内运作良好的医疗信息系统的基石。准确和最新的数据提供了基础数据&#xff0c;有助于推动服务可用…

5分钟掌握接口自动化测试,4个知识点简单易学!

一. 什么是接口测试 接口测试是一种软件测试方法&#xff0c;用于验证不同软件组件之间的通信接口是否按预期工作。在接口测试中&#xff0c;测试人员会发送请求并检查接收到的响应&#xff0c;以确保接口在不同场景下都能正常工作。 就工具而言&#xff0c;常见的测试工具有…

16-Verilog实现二线制I2C CMOS串行EEPROM的读写操作

Verilog实现二线制I2C CMOS串行EEPROM的读写操作 1&#xff0c;二线制I2C CMOS串行EEPROM的简单介绍2&#xff0c;I2C总线特征介绍3&#xff0c;二线制I2C、CMOS串行EEPROM的读写操作4&#xff0c;EEPROM的Verilog HDL程序4.1&#xff0c;EEPROM的行为模型思路如下&#xff1a;…

【Kotlin】Kotlin环境搭建

1 前言 Kotlin 是一种现代但已经成熟的编程语言&#xff0c;由 JetBrains 公司于 2011 年设计和开发&#xff0c;并在 2012 年开源&#xff0c;在 2016 年发布 v1.0 版本。在 2017 年&#xff0c;Google 宣布 Kotlin 正式成为 Android 开发语言&#xff0c;这进一步推动了 Kotl…

【Go】一、Go语言基本语法与常用方法容器

GO基础 Go语言是由Google于2006年开源的静态语言 1972&#xff1a;&#xff08;C语言&#xff09; — 1983&#xff08;C&#xff09;—1991&#xff08;python&#xff09;—1995&#xff08;java、PHP、js&#xff09;—2005&#xff08;amd双核技术 web端新技术飞速发展&…

揭秘可解释性AI:构建信任的桥梁

--- ### 揭秘可解释性AI&#xff1a;构建信任的桥梁 在当前人工智能技术的迅猛发展中&#xff0c;可解释性AI&#xff08;XAI&#xff09;逐渐成为推动技术透明度和增强人机信任的重要工具。XAI旨在解开AI决策过程的“黑箱”&#xff0c;使机器的思考过程更加透明和可理解。本…

【Python程序开发系列】聊一聊github的pull request几种合并方式

一、什么是PR 在正常的工作流程中&#xff0c;PR 用于将一个分支的更改合并到另一个分支&#xff0c;而这些更改通常以提交的形式存在。每个提交都有一个唯一的提交 ID&#xff0c;用于标识和跟踪更改的历史。因此一般情况下PR包含源分支的多个commit提交记录&#xff08;pr_co…