Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >backgroundworker组件的使用

backgroundworker组件的使用

作者头像
跟着阿笨一起玩NET
发布于 2018-09-19 03:05:52
发布于 2018-09-19 03:05:52
1K00
代码可运行
举报
运行总次数:0
代码可运行

本文转载:http://www.cnblogs.com/inforasc/archive/2009/10/12/1582110.html

BackgroundWorker 组件用来执行诸如数据库事务、文件下载等耗时的异步操作。

开始

在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以从工具上直接拖到应用程序:

BackgroundWorker backgroundWorker1 = new BackgroundWorker();

为了开始在后台操作,必须调用BackgroundWorker的RunWorkerAsync()方法,当调用此方时,BackgroundWorker 通过触发DoWork 事件,开始执行后台操作,DoWork 事件的代码是在另一个线程里执行的。代码如下:

代码一:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 BackgroundWorker backgroundWorker1 = new BackgroundWorker();
 //在另一个线程里开始操作(btnStart是一个按钮控件)
 //也可以利用RunWokerAsync()方法传递参数,
 private void btnStart_Click(object sender, EventArgs e) 
 { 
           backgroundWorker1.RunWokerAsync(2000/*参数是可选的*/); 
 } 
 //DoWork事件在另一个线程里执行 
 private void backgroundWorker1_DoWork(objectsender,DoWorkeventArgs e) 
 { 
         //允许长时间的操作 
  int input = (int)e.Argument; 
         Thread.Sleep(input); 
 }
 

显示后台操作进度

为了显示后台操作的执行进度,首先要使WorkerReportsProgress 等于true,然后调用BackgroundWorker的ReportProgress()方法,通过它传递操作完成的进度值,此外,该方法触发ProgressChanged事件,在是此事件中,通过ProgressChangedEventArgs的实例,接收到主线程传递过来的参数。

代码二:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 BackgroundWorker backgroundWorker1 = new BackgroundWorker();
 
 backgroundWorker1.WorkerReportsProgress = true;
 
 private void btnStart_Click(object sender, EventArgs e) 
 { 
             backgroundWorker1.RunWokerAsync(); 
 } 
 private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e) 
 { 
  for (int i = 1; i < 11; i++) 
      { 
               Thread.Sleep(2000); 
              backgroundWorker1.ReportProgress(i*10); 
      } 
 } 
 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
 
 { 
       //progressBar1是ProgressBar控件 
       progressBar1.Value = e.ProgressPercentage; 
 }
 

取消后台操作

为了使 BackgroundWorker 可以取消后台正在执行的操作,首先要把属性WorkerSupportsCancellation 的值设置为 true。接着调用CancelAsync()方法,该方法使得属性CancellationPending 为true,利用CancellationPending 属性,可以判断是否取消后台异步操作。

代码三:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 BackgroundWorker backgroundWorker1 = new BackgroundWorker(); 
 backgroundWorker1.WorkerReportsProgress = true;
 
 backgroundWorker1.WorkerSupportsCancellation = true; 
 private void btnStart_Click(object sender, EventArgs e) 
 { 
        backgroundWorker1.RunWokerAsync(); 
 } 
 private void btnCancel_Click(object sender, EventArgs e) 
 { 
       backgroundWorker1.CancelAsync(); 
 } 
 private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e) 
 { 
       for (int i = 1; i < 11; i++) 
      { 
              Thread.Sleep(2000); 
              backgroundWorker1.ReportProgress(i*10); 
             if(backgroundWorker1.CancellationPending) 
             { 
                    e.Cancel = true; 
                    return; 
              } 
       } 
 } 
 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
 { 
          progressBar1.Value = e.ProgressPercentage; 
 } 
  
 

后台操作完成后,反馈给用户

当后台操作完成以后,无论是completed 还是cancelled,则RunWorkerCompleted 事件被触发,通过此方法可以将后台操作的完成结果反馈给用户;

另外,通过RunWorkerCompletedEventArgs实例的Cancelled 属性,以判断是否是Cancel操作使得后台操作终止;

代码片段:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
 if(e.Cancelled)
 
 {
 
        MessageBox.Show("Operation Cancelled");
 
 }
 
 else
 
 {
 
        MessageBox.Show("OperationCompleted");
 
 }
 
}

从后台操作返回值

在执行DoWork 事件时,DoWorkEventArgs 实例的Result 属性,返回值到用户;在RunWorkerCompleted 事件里,RunWorkerCompletedEventArgs 实例的Result 属性接收值;

代码片段:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e) 
{ 
 Thread.Sleep(2000);
 
 //在此处设置返回值
 
 e.Result = 10;
 
} 
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
 //在此处接收传递回来的值
 
 int returnValue = (int)e.Result;
 
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-02-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2023年12月 Winform控件专题 BackgroundWorker控件详解
Winform控件是Windows Forms中的用户界面元素,它们可以用于创建Windows应用程序的各种视觉和交互组件,例如按钮、标签、文本框、下拉列表框、复选框、单选框、进度条等。开发人员可以使用Winform控件来构建用户界面并响应用户的操作行为,从而创建功能强大的桌面应用程序。
愚公搬代码
2023/12/21
6820
一个通过BackgroundWorker实现WinForm异步操作的例子
在最近的一个Smart Client项目中,为了演示异步操作的实现,写了一个基于BackgorundWorker的例子。由于这个理基本上实现了BackgorundWorker的大部分功能:异步操作的启动、操作结束后的回调、异步操作的撤销和进度报告等等。尽管没有太多的技术含量,姑且放上来与大家分享。
蒋金楠
2022/05/09
6580
一个通过BackgroundWorker实现WinForm异步操作的例子
C#基础知识回顾--BackgroundWorker介绍
简介 BackgroundWorker是.net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题。 该控件有三个事件: DoWork 、ProgressChanged 和 RunWorkerCompleted 在程序中调用RunWorkerAsync方法则会启动D
hbbliyong
2018/03/05
1.2K0
C#中backgroundworker的使用
CancellationPending 是用户取消的标志,当用户调用CancelAsync()方法时CancellationPending 会为true。 e.Cancel = true;将结果会被传送到RunWorkerCompleted事件中(任务完成事件)
MaybeHC
2024/04/23
2510
C#中backgroundworker的使用
浅谈.Net异步编程的前世今生----EAP篇
在上一篇博文中,我们提到了APM模型实现异步编程的模式,通过使用APM模型,可以简化.Net中编写异步程序的方式,但APM模型本身依然存在一些缺点,如无法得知操作进度,不能取消异步操作等。
独立观察员
2022/12/06
5270
浅谈.Net异步编程的前世今生----EAP篇
C#中连接数据库15秒检测程序假死避免问题
在C#中,连接SQLSERVER数据库时,程序对数据库的连接测试时间为15秒,这15秒中如果没有连接成功,程序是处于一种假死的状态。当然,这种假死状态不仅仅局限于这15秒的测试,还有数据库的大数据量查询,大数据量处理,大数据量下载等等,我们可以对思路进行转变,转变为利用一个后台运行进程控件来实现后台自动运行,不影响前台界面的操作,从而避免期间用户操作不了界面,程序处于假死状态。
静谧的小码农
2019/01/11
1.5K0
绝对干货:自定义msi安装包的执行过程
有时候我们需要在程序中执行另一个程序的安装,这就需要我们去自定义msi安装包的执行过程。 比如我要做一个安装管理程序,可以根据用户的选择安装不同的子产品。当用户选择了三个产品时,如果分别显示这三个产品的安装交互UI显然是不恰当的。我们期望用一个统一的自定义UI去取代每个产品各自的UI。 平时使用msiexec.exe习惯了,所以最直接的想法就是在一个子进程中执行:     msiexec.exe /qn 这样固然是能够完成任务,但是不是太简陋了? 安装开始后我们想取消这次安装怎么办? 或者我们还想要拿到一
葡萄城控件
2018/01/10
2.1K0
绝对干货:自定义msi安装包的执行过程
C#-WPF ProgressBar进度条
进度条常用在加载,下载,导出一些比较耗时的地方,利用进度条能让用户看到实时进展,能有更好的用户体验……
kdyonly
2023/03/03
1.2K0
C# BackgroundWorker用法详解
在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题。解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完成。但是原生接口的线程操作有一些难度,如果要更进一步的去完成线程间的通信就会难上加难。
zls365
2021/01/13
1.4K0
C# BackgroundWorker用法详解
【C#】带等待窗体的BackgroundWorker
---------------201504170911更新---------------
AhDung
2018/09/13
1.8K0
【C#】带等待窗体的BackgroundWorker
6搞懂线程池(二)
抱歉各位多线程专栏托更这么久,这篇文章我们继续讲线程池的相关知识,其中将涉及到如下知识:
喵叔
2020/09/08
5120
BackgroundWorker在单独的线程上执行操作
直接使用多线程有时候会带来莫名其妙的错误,不定时的发生,有时候会让程序直接崩溃,其实BackgroundWorker 类允许您在单独的专用线程上运行操作。可以通过编程方式创建 BackgroundWorker,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。
张果
2022/05/09
1.3K0
BackgroundWorker在单独的线程上执行操作
在VB.net中WinForm+Backgroundworker+StatusStrip范例
在VB.net中WinForm+Backgroundworker+StatusStrip范例
哆哆Excel
2024/04/11
1960
在VB.net中WinForm+Backgroundworker+StatusStrip范例
如果在BackgroundWorker运行过程中关闭窗体…
在Windows Form应用中,BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。由于操作是异步执行的,用户可能在异步操作执行过程中关闭当前窗体,而窗体的关闭会伴随着Dispose方法的执行。如果我们注册了BackgroundWorker的RunWorkerC
蒋金楠
2018/02/07
1.3K0
如果在BackgroundWorker运行过程中关闭窗体…
从零开始搭建一个GIS开发小框架(九)——WPF进度条效果
今天借GIS项目实现一个进度条效果,这个效果在各种管理系统中是最常见的一个效果,特别是在处理某个任务消耗的时间过长的场景,可以避免UI假死,提高用户体验。我这次用的POI数据大概有90W条,这个目录树是我为了练手,故意拆成五层的,其实从第三层到第五层原本是放在一个字段里的string型POI类型描述,将它拆解成三层树结构时损耗了部分性能,到最下面一层(图标是感叹号)类型,大概有5700多个叶子节点,加载这个资源目录树需要一段时间,这里用委托实现页面传值+BackgroundWorker实现异步弹框进度条效果。我原来在winform里面实现过,但是WPF框架里还没做过,拿这个练练手,为今后的工(qiu)作(zhi)任(mian)务(shi)做好技术储备。
天堂向左
2022/12/01
6000
从零开始搭建一个GIS开发小框架(九)——WPF进度条效果
xBIM 实战03 使用WPF技术实现IFC模型的加载与浏览
  WPF应用程序在底层使用 DirectX ,无论设计复杂的3D图形(这是 DirectX 的特长所在)还是绘制简单的按钮与文本,所有绘图工作都是通过 DirectX 管线完成的。在硬件加速方面也带来了好处,DirectX 在渲染图形时会将尽可能多的工作递交给图形处理单元(GPU)去处理,GPU是显卡的专用处理器。
张传宁IT讲堂
2019/09/17
9340
xBIM 实战03 使用WPF技术实现IFC模型的加载与浏览
并发编程 ---为何要线程池化
众所周知,使用线程可以极大的提高应用程序的效率和响应性,提高用户体验,但是不可以无节制的使用线程,为什么呢?
Niuery Diary
2023/10/22
2050
并发编程 ---为何要线程池化
温故而知新:WinForm/Silverlight多线程编程中如何更新UI控件的值
单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么做,比如: private void btnSet_Click(object sender, EventArgs e) {         Thread t = new Thread(new ParameterizedThreadStart(SetTextBoxValue)); //当然也可以用匿名委托写成Thread t = 
菩提树下的杨过
2018/01/23
1.9K0
(七十三)c#Winform自定义控件-资源加载窗体
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/29
9040
(七十三)c#Winform自定义控件-资源加载窗体
面试必备:C#多线程技术
进程是应用的执行实例,可狭义理解为一个应用程序就是一个进程。启用一个应用程序时就是启动了一个进程。
郑子铭
2023/08/30
4740
面试必备:C#多线程技术
推荐阅读
相关推荐
【愚公系列】2023年12月 Winform控件专题 BackgroundWorker控件详解
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验