简介

BackgroundWorker是.net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题。
该控件有三个事件:
DoWork 、ProgressChanged 和 RunWorkerCompleted
在程序中调用RunWorkerAsync方法则会启动DoWork事件的事件处理,当在事件处理过程中,调用 ReportProgress方法则会启动ProgressChanged事件的事件处理,而当DoWork事件处理完成时,则会触发RunWorkerCompleted事件。
您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged和 RunWorkerCompleted 事件与用户界面进行通信。

三个事件

DoWork 事件

 
void backgroundWorker1_DoWork( Object sender, DoWorkEventArgs e )
其中句柄sender指向的就是该BackgroundWorker控件。
第二个参数e有三个属性,Argument,Cancel和Result。
 
Argument:
大家应该还记得如何触发DoWork事件吧?对了,就是在程序中调用RunWorkerAsync方法,RunWorkerAsync方法有两种重载,第一种是无参形式,第二种是有一个指向Object^类型的参数,如果你调用的是有参类型的RunWorkerAsync,则DoWork事件处理程序的第二个参数e的Argment属性将会返回一个指向你传递过来的这个参数。
 
Cancel:
DoWork 事件处理程序中的代码应定期检查 CancellationPending属性值,并在该值为true时中止操作。出现这种情况时,可以将 System.ComponentModel.DoWorkEventArgs 的 Cancel标志设置为true,同时将 RunWorkerCompleted 事件处理程序中的 System.ComponentModel.RunWorkerCompletedEventArgs的 Cancelled 标志设置为true
 
Result:
等下面讲到RunWorkerCompleted事件时再细说。

RunWorkerCompleted事件

当DoWork事件处理完成之后,将会触发该事件。
void backgroundWorker1_RunWorkerCompleted( Object sender, RunWorkerCompletedEventArgs e )
现在主要讲第二个参数e,最重要的属性是Result。
在DoWork事件中,你将Result设置成什么,这里的Result就返回什么。

ProgressChanged事件

在DoWork事件的处理过程中,如果调用ReportProgress则会发生该事件。
void backgroundWorker1_ProgressChanged( Object sender, ProgressChangedEventArgs e )
先来说说ReportProgress的两种重载:
void ReportProgress(int percentProgress)
void ReportProgress(int percentProgress,Object userState)
ProgressChanged事件处理程序的第二个参数e有一个ProgressPercentage属性,它就由ReportProgress的第一个参数percentProgress来提供。这个参数一般用来报告该后台操作完成的进度,然后用ProgressChanged的第二个参数e的ProgressPercentage属性来获取该进度信息。如果用户还想传递更多的信息,可以使用ReportProgress的第二种重载,它的第二个参数userState将会传递给ProgressChanged事件的参数e的UserState属性。
好,下面来一段MSDN上的例子:
namespace BwTester
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
BackgroundWorker backgroundWorker;
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
backgroundWorker.RunWorkerAsync();
}
void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = ; i < ; i++)
{
backgroundWorker.ReportProgress(i);
Thread.Sleep();
}
}
}
}

C#基础知识回顾--BackgroundWorker介绍的更多相关文章

  1. C#基础知识回顾-- 反射(1)

    C#基础知识回顾-- 反射(1)   反射(reflection)是一种允许用户获得类型信息的C#特性.术语“反射”源自于它的工作方式: Type对象映射它所代表的底层对象.对Type对象进行查询可以 ...

  2. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  3. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  4. C#基础知识回顾-- 反射(3)

    C#基础知识回顾-- 反射(3)   获取Type对象的构造函数: 前一篇因为篇幅问题因为篇幅太短被移除首页,反射这一块还有一篇“怎样在程序集中使用反射”, 其他没有什么可以写的了,前两篇主要是铺垫, ...

  5. C#基础知识回顾--线程传参

    C#基础知识回顾--线程传参 在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数, 也不能有返回值.如果希望传递参数给执行函数, ...

  6. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  7. C++ 基础知识回顾总结

    一.前言 为啥要写这篇博客?答:之前学习的C和C++相关的知识,早就被自己忘到一边去了.但是,随着音视频的学习的不断深入,和C/C++打交道的次数越来越多,看代码是没问题的,但是真到自己操刀去写一些代 ...

  8. scrapy实战1,基础知识回顾和虚拟环境准备

        视频地址 https://coding.imooc.com/learn/list/92.html   一. 基础知识回顾     1. 正则表达式 1)贪婪匹配,非贪婪匹配 .*? 非贪婪 . ...

  9. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

随机推荐

  1. java 实例化泛型且赋值

    实例化泛型 Class <T> clazz = (Class <T>) ((ParameterizedType) new Entity().getClass().getGene ...

  2. 双缓冲队列解决WPF界面卡死

    工作中的项目,CS客户端会通过MQ接收前端设备发送的信息,之前测试的时候,由于测试的数据不大,没有进行压力测试,软件可以正常工作,随着项目现场设备数量的增加,CS客户端从MQ中订阅的数据量不断增加,最 ...

  3. C# VS .NET 版本对应关系

    ╔══════╦══════╦═══════╦════ ══╦═══════╗ ║ C# version ║ VS version ║ .NET version ║ CLR version ║ Rel ...

  4. Eclipse (JavaEE版)中修改web项目的访问路径

    访问路径,也就是指在浏览器中访问该web系统时的根路径,比如http://localhost:8080/xxxx/index.jsp  这里的xxxx. 也就是request.getContextPa ...

  5. Pacemaker 介绍

    1. 简介 Pacemaker是一个集群资源管理者.他用资源级别的监测和恢复来保证集群服务(aka.资源)的最大可用性.它可以用你所擅长的基础组件(Corosync或者是Heartbeat)来实现通信 ...

  6. CRUD组件的高阶使用

    1.list页面自定列显示: class PermissionConfig(sites.AryaConfig):       def dabo(self, obj=None, is_header=Fa ...

  7. Mac 设置终端中使用 sublime 打开文件

    在Mac下用终端创建文件等比较方便,但如果配合Sublime用,最好是可以直接在终端中输入命令就可以用Sublime打开指定文件或文件夹. #检查用户目录下有没有bin目录,如里没有就创建一个(目的是 ...

  8. Brainteaser-292. Nim Game

    You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...

  9. clang 编译 OC

    clang -fobjc-arc -framework Foundation helloworld.m -o helloworld.out OVERVIEW: clang LLVM compiler ...

  10. class字节码结构(三)(字段集合的结构)

    <Java虚拟机原理图解>1.4 class文件中的字段表集合--field字段在class文件中是怎样组织的 字段区:包括了字段计数器和字段数据区: 字段是指在类中定义的静态或者非静态的 ...