C#【多线程篇】BackgroundWorker类使用总结

2023-12-29 22:58

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

查询了一下MSDN文档,其中微软就BackgroundWorker类的功能有这么一个描述(英文的,根据个人理解翻译):BackgroundWorker类允许您在单独的线程上执行某个可能导致用户界面(UI)停止响应的耗时操作(比如文件下载数据库事务等),并且想要一个响应式的UI来反应当前耗时操作的进度。 
可以看的出来,BackgroundWorker组件提供了一种执行异步操作(后台线程)的同时,并且还能妥妥的显示操作进度的解决方案。于是乎,我便深入的了解了一下BackgroundWorker类。针对BackgroundWorker类的部分重要属性和方法进行了一次总结。 

1、属性:

  • WorkerReportsProgress 
    bool类型,指示BackgroundWorker是否可以报告进度更新。当该属性值为True是,将可以成功调用ReportProgress方法,否则将引发InvalidOperationException异常。 用法:
private BackgroundWorker bgWorker = new BackgroundWorker();
bgWorker.WorkerReportsProgress = true;
  • WorkerSupportsCancellation 
    bool类型,指示BackgroundWorker是否支持异步取消操作。当该属性值为True是,将可以成功调用CancelAsync方法,否则将引发InvalidOperationException异常。 用法:
bgWorker.WorkerSupportsCancellation = true;
  • CancellationPending 
    bool类型,指示应用程序是否已请求取消后台操作。此属性通常放在用户执行的异步操作内部,用来判断用户是否取消执行异步操作。当执行BackgroundWorker.CancelAsync()方法时,该属性值将变为True。 用法:
private BackgroundWorker bgWorker = new BackgroundWorker();
bgWorker.WorkerReportsProgress = true;
//在DoWork中键入如下代码
for (int i = 0; i <= 100; i++)
{if (bgWorker.CancellationPending){e.Cancel = true;return;}else{bgWorker.ReportProgress(i,"Working");System.Threading.Thread.Sleep(10);}
}

  • IsBusy 
    bool类型,指示BackgroundWorker是否正在执行一个异步操作。此属性通常放在BackgroundWorker.RunWorkerAsync()方法之前,避免多次调用RunWorkerAsync()方法引发异常。当执行BackgroundWorker.RunWorkerAsync()方法是,该属性值将变为True。
//防止重复执行异步操作引发错误
if (bgWorker.IsBusy)return;
bgWorker.RunWorkerAsync();

2、方法:

  • RunWorkerAsync() 
    开始执行一个后台操作。调用该方法后,将触发BackgroundWorker.DoWork事件,并以异步的方式执行DoWork事件中的代码。 
    该方法还有一个带参数的重载方法:RunWorkerAsync(Object)。该方法允许传递一个Object类型的参数到后台操作中,并且可以通过DoWork事件的DoWorkEventArgs.Argument属性将该参数提取出来。 
    注:当BackgroundWorker的IsBusy属性为True时,调用该方法将引发InvalidOperationException异常。
//在启动异步操作的地方键入代码
bgWorker.RunWorkerAsync("hello");
  • ReportProgress(Int percentProgress) 
    报告操作进度。调用该方法后,将触发BackgroundWorker. ProgressChanged事件。另外,该方法包含了一个int类型的参数percentProgress,用来表示当前异步操作所执行的进度百分比。 
    该方法还有一个重载方法:ReportProgress(Int percentProgress, Object userState)。允许传递一个Object类型的状态对象到 ProgressChanged事件中,并且可以通过ProgressChanged事件的ProgressChangedEventArgs.UserState属性取得参数值。 
    注:调用该方法之前需确保WorkerReportsProgress属性值为True,否则将引发InvalidOperationException异常。 
    用法:
for (int i = 0; i <= 100; i++)
{//向ProgressChanged报告进度bgWorker.ReportProgress(i,"Working");System.Threading.Thread.Sleep(10);
}
  • CancelAsync() 
    请求取消当前正在执行的异步操作。调用该方法将使BackgroundWorker.CancellationPending属性设置为True。 
    但需要注意的是,并非每次调用CancelAsync()都能确保异步操作,CancelAsync()通常不适用于取消一个紧密执行的操作,更适用于在循环体中执行。 
    用法:
//在需要执行取消操作的地方键入以下代码
bgWorker.CancelAsync();

3、事件:

  • DoWork 
    用于承载异步操作。当调用BackgroundWorker.RunWorkerAsync()时触发。 
    需要注意的是,由于DoWork事件内部的代码运行在非UI线程之上,所以在DoWork事件内部应避免于用户界面交互,而于用户界面交互的操作应放置在ProgressChanged和RunWorkerCompleted事件中。

  • ProgressChanged 
    当调用BackgroundWorker.ReportProgress(int percentProgress)方式时触发该事件。 
    该事件的ProgressChangedEventArgs.ProgressPercentage属性可以接收来自ReportProgress方法传递的percentProgress参数值,ProgressChangedEventArgs.UserState属性可以接收来自ReportProgress方法传递的userState参数。

  • RunWorkerCompleted 
    异步操作完成或取消时执行的操作,当调用DoWork事件执行完成时触发。 
    该事件的RunWorkerCompletedEventArgs参数包含三个常用的属性Error,Cancelled,Result。其中,Error表示在执行异步操作期间发生的错误;Cancelled用于判断用户是否取消了异步操作;Result属性接收来自DoWork事件的DoWorkEventArgs参数的Result属性值,可用于传递异步操作的执行结果。

4、源代码:

using System;
using System.ComponentModel;
using System.Windows.Forms;namespace WindowsFormsApp1
{public partial class Form1 : Form{private BackgroundWorker bgWorker = new BackgroundWorker();public Form1(){InitializeComponent();InitializeBackgroundWorker();}private void InitializeBackgroundWorker(){bgWorker.WorkerReportsProgress = true;bgWorker.WorkerSupportsCancellation = true;bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged);bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);}public void bgWorker_DoWork(object sender, DoWorkEventArgs e){for (int i = 0; i <= 100; i++){if (bgWorker.CancellationPending){e.Cancel = true;return;}else{bgWorker.ReportProgress(i, "Working");System.Threading.Thread.Sleep(10);}}}public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e){string state =(string)e.UserState;//接收ReportProgress方法传递过来的userStatethis.label2.Text = "状态:" +state;this.progressBar1.Value = e.ProgressPercentage;this.label1.Text = "处理进度:" + Convert.ToString(e.ProgressPercentage) + "%";}public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e){if (e.Error != null){MessageBox.Show(e.Error.ToString());return;}if (!e.Cancelled)this.label1.Text = "处理完毕!";elsethis.label1.Text = "处理终止!";}private void btnStart_Click_1(object sender, EventArgs e){if (bgWorker.IsBusy)return;this.progressBar1.Maximum = 100;this.btnStart.Enabled = false;this.btnStop.Enabled = true;bgWorker.RunWorkerAsync("hello");}private void btnStop_Click_1(object sender, EventArgs e){this.btnStart.Enabled = true;this.btnStop.Enabled = false;bgWorker.CancelAsync();}}
}

 执行效果:

参考:C# BackgroundWorker使用总结 - 五维思考 - 博客园

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



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

相关文章

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时