《C#多线程编程实战(原书第2版)》——3.8 使用BackgroundWorker组件

简介:

本节书摘来自华章出版社《C#多线程编程实战(原书第2版)》一书中的第3章,第3.8节,作者(美)易格恩·阿格佛温(Eugene Agafonov),黄博文 黄辉兰 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.8 使用BackgroundWorker组件

本节实例演示了另一种异步编程的方式,即使用BackgroundWorker组件。借助于该对象,可以将异步代码组织为一系列事件及事件处理器。你将学会如何使用该组件进行异步编程。

3.8.1 准备工作

为了学习本节,你需要安装Visual Studio 2015。除此之外无需其他准备。本节的源代码放置在BookSamplesChapter3Recipe7目录中。

3.8.2 实现方式

请执行以下步骤来学习如何使用BackgroundWorker组件:

1.启动Visual Studio 2015。新建一个C#控制台应用程序项目。

2.在Program.cs文件中加入以下using指令:


320caaa70cbe0c330d8a91ab2d62a142957029c0

3.在Main方法下面加入以下代码片段:


d870d09c3d23c384417571b27b2d3aba4d17c286


6dd2d30c740cfb991f85fc3dfddf4587464bf862


efcfacaa38dbeb27c1225f64d356b41fe89f2b0a

4.在Main方法中加入以下代码片段:


f65096a5eb70c8f41c987bedd3a19176ec499e31

5.运行程序。

3.8.3 工作原理

当程序启动时,创建了一个BackgroundWorker组件的实例。显式地指出该后台工作者线程支持取消操作及该操作进度的通知。

接下来是最有意思的部分。我们没有使用线程池和委托,而是使用了另一个C#语法,称为事件。事件表示了一些通知的源或当通知到达时会有所响应的一系列订阅者。在本例中,我们将订阅三个事件,当这些事件发生时,将调用相应的事件处理器。当事件通知其订阅者时,具有特殊的定义签名的方法将被调用。

因此,除了将异步API组织为Begin/End方法对,还可以只启动一个异步操作然后订阅给不同的事件。这些事件在该操作执行时会被触发。这种方式被称为基于事件的异步模式(Event-based Asynchronous Pattern,简称EAP)。这是历史上第二种用来构造异步程序的方式,现在更推荐使用TPL,第4章中将会描述该方式。

我们共定义了三个事件。第一个是DoWork事件。当一个后台工作对象通过RunWorker-Async方法启动一个异步操作时,该事件处理器将被调用。该事件处理器将会运行在线程池中。如果需要取消操作,则这里是主要的操作点。同时也可以提供该操作的运行进程信息。最后,得到结果后,将结果设置给事件参数,然后RunWorkerCompleted事件处理器将被调用。在该方法中,可以知道操作是成功完成,还是发生错误,抑或被取消。

基于此,BackgroundWorker组件实际上被使用于Windows窗体应用程序(Windows Forms Applications,简称WPF)中。该实现通过后台工作事件处理器的代码可以直接与UI控制器交互。与线程池中的线程与UI控制器交互的方式相比较,使用BackgroundWorker组件的方式更加自然和好用。

相关文章
|
1月前
|
存储 消息中间件 缓存
C++ Qt开发:运用QThread多线程组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QThread`组件实现多线程功能。
25 2
C++ Qt开发:运用QThread多线程组件
|
2月前
|
存储 监控 程序员
线程死锁检测组件逻辑与源码
线程死锁检测组件逻辑与源码
66 2
|
6月前
|
监控 安全 Java
自旋锁的伪代码实现,CAS的ABA问题,JUC常见类:Callable,ReentrantLock,线程创建方法的总结,信号量,原子类的应用场景,特定场所的组件CountDomLatch,针对集合类的
自旋锁的伪代码实现,CAS的ABA问题,JUC常见类:Callable,ReentrantLock,线程创建方法的总结,信号量,原子类的应用场景,特定场所的组件CountDomLatch,针对集合类的
|
11月前
并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量
并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量
42 0
|
C++
C/C++ Qt QThread 线程组件应用
QThread库是QT中提供的跨平台多线程实现方案,使用时需要继承QThread这个基类,并重写实现内部的Run方法,由于该库是基本库,默认依赖于`QtCore.dll`这个基础模块,在使用时无需引入其他模块.
205 0
|
存储 缓存 安全
全链路跟踪(压测)必备基础组件之线程上下文“三剑客”
全链路跟踪(压测)必备基础组件之线程上下文“三剑客”
全链路跟踪(压测)必备基础组件之线程上下文“三剑客”
|
Java 开发者
手撕源码!线程池核心组件源码剖析
看源码之前,先了解一下该组件 最主要的几个 接口、抽象类和实现类的结构关系。
134 0
手撕源码!线程池核心组件源码剖析
|
Java
Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析
1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步组件CountDownLatch和CyclicBarrier。
1024 0