【C#控件专题二】BackGroundWorker控件使用

2024-03-15 12:18

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

BackGroundWorker实际上是一个异步的事件进度控制控件,通常结合进度条ProgressBar一起使用,如下测试源码

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace BackGroundWorker
{public partial class BgWorkerForm : System.Windows.Forms.Form{public BgWorkerForm(){InitializeComponent();//指示BackgroundWorker是否可以报告进度更新。为True时,将可以成功调用ReportProgress方法,否则将引发InvalidOperationException异常。bgWorker.WorkerReportsProgress = true;//指示BackgroundWorker是否支持异步取消操作。为True时,将可以成功调用CancelAsync方法,否则将引发InvalidOperationException异常。bgWorker.WorkerSupportsCancellation = true; bgWorker.DoWork += BgWorker_DoWork; //执行异步操作的函数,在另一个线程中执行bgWorker.ProgressChanged += BgWorker_ProgressChanged;   //报告进度更新的函数bgWorker.RunWorkerCompleted += BgWorker_RunWorkerCompleted; //报告进度完成的函数string uiID =  Thread.CurrentThread.ManagedThreadId.ToString(); //或AppDomain.GetCurrentThreadId().ToString()mainUiLabel.Text = string.Format("主UI线程ID为:{0}", uiID);}private void BgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){if (e.Error != null){MessageBox.Show(e.Error.ToString());return;}if (!e.Cancelled)                       //判断是否人为终止infoLabel.Text = "处理完毕!";elseinfoLabel.Text = "处理终止!";string RunWorkerCompletedID = Thread.CurrentThread.ManagedThreadId.ToString(); //或AppDomain.GetCurrentThreadId().ToString()runWorkerCompletedLabel.Text = string.Format("RunWorkerCompleted运行线程ID为:{0}", RunWorkerCompletedID);doWorkLabel.Text = string.Format("DoWork运行线程ID为:{0}", DoWorkID);}private void BgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e){progressBar.Value = e.ProgressPercentage;   //获取报告值// Extract the argument.string param = (string)e.UserState; //Working...infoLabel.Text = "处理进度:" + Convert.ToString(e.ProgressPercentage) + "%";string ProgressChangedID = Thread.CurrentThread.ManagedThreadId.ToString(); //或AppDomain.GetCurrentThreadId().ToString()progressChangedLabel.Text = string.Format("ProgressChanged运行线程ID为:{0}", ProgressChangedID);}private string DoWorkID;private void BgWorker_DoWork(object sender, DoWorkEventArgs e){// Do not access the form's BackgroundWorker reference directly.// Instead, use the reference provided by the sender parameter.BackgroundWorker bw = sender as BackgroundWorker;// Extract the argument.string param = (string)e.Argument; //param// If the operation was canceled by the user, // set the DoWorkEventArgs.Cancel property to true.//在DoWork中键入如下代码for (int i = 0; i <= 100; i++){if (bw.CancellationPending)   //状态,可检索是否取消了{//Cancel事件发生后仍会先进这里,这个函数完结了才会调用BgWorker_RunWorkerCompleted//这里的标志位决定了后续BgWorker_RunWorkerCompleted里的标志位e.Cancel = true;        return;}else{bw.ReportProgress(i, "Working...");  //提交状态报告,将触发BgWorker_ProgressChanged事件System.Threading.Thread.Sleep(100);}}DoWorkID = Thread.CurrentThread.ManagedThreadId.ToString(); //或AppDomain.GetCurrentThreadId().ToString()}private void startBtn_Click(object sender, EventArgs e){if (bgWorker.IsBusy)return; //避免还处在工作状态时被重复触发progressBar.Maximum = 100;bgWorker.RunWorkerAsync("param");}private void cancelBtn_Click(object sender, EventArgs e){bgWorker.CancelAsync(); //停止运行}private void Form_Load(object sender, EventArgs e){}}
}

运行效果:

我们发现仅DoWork事件运行在另一条线程,其他事件均在主UI线程运行。

这篇关于【C#控件专题二】BackGroundWorker控件使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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依