实现增强的异步任务执行组件

概述

在应用程序中,可能会遇到一些执行耗时的功能操作,比如数据下载、复杂计算及数据库事务等,一般这样的功能会在单独的线程上实现,避免出现用户界面长时间无响应情况。在.NET 2.0中,FCL提供了BackgroundWorker组件来方便的实现这些功能要求,该组件在功能上的确很吸引人。本文将实现一个增强的BackgroundWorker组件,支持基于事件的多任务异步操作。

功能介绍

BackgroundWorker 组件采用基于事件的异步模式简化了多线程操作编程,不过其不能对多个异步任务生命期进行管理,因此开发人员可能会通过使用多个 BackgroundWorker实例来应对异步操作密集的情况。MultiBackgroundWorker组件解决多任务的问题,使得单个实例对多个异步任务的生命期进行集中管理,对于每个任务同样提供异步任务操作请求,异步任务执行进度汇报以及异步任务结束通知。

异步任务操作请求。MultiBackgroundWorker组件提供了RunWorkerAsync方法来开始一个异步操作的请求,该方法需要一个参数来唯一标识新的异步任务,如果任务执行过程中需要用到相关信息数据可以通过第二个参数传入。

public virtualvoid RunWorkerAsync(object taskId, object argument);

在RunWorkerAsync方法调用后,MultiBackgroundWorker会生成一个新的异步任务,并对其生命周期进行管理,同时触发DoWork 事件。

public event MultiDoWorkEventHandler DoWork;

在事件处理程序中通过MultiDoWorkEventArgs对象获取参数信息和任务标识。类似于BackgroundWorker 组件,调用程序注册DoWork 事件并在该事件处理程序中编写异步处理逻辑代码。DoWork事件处理程序执行的线程不同于调用RunWorkerAsync 方法的线程,因此,调用线程是UI线程时,在DoWork 事件处理程序中就不能编写访问UI元素的代码,而实际在编写WinForm应用程序时调用线程基本上UI线程,值得注意。

异步任务执行进度汇报。同BackgroundWorker组件一样,MultiBackgroundWorker同样提供了ReportProgress方法。

public void ReportProgress(object taskId, int progressPercentage, object userState);

方法的第一个参数为进度汇报对应的任务标识, 第二个参数为已完成的异步任务操作进度所占的百分比,取值范围从0到100,最后一个参数为用户自定义信息。在调用ReportProgress 方法后将激发ProgressChanged事件。

public event MultiProgressChangedEventHandler ProgressChanged;

调用程序在对应的事件处理程序中可以访问MultiProgressChangedEventArgs对象获取进度信息并显示到界面上。

异步任务结束通知。如果调用程序需要获得每个异步任务结束通知以便执行一些后续代码,那么可以通过注册RunWorkerCompleted 事件来实现。

public event MultiRunWorkerCompletedEventHandler RunWorkerCompleted;

异步任务人为取消、异常终止或正常结束都会触发RunWorkerCompleted事件,并且在该事件处理程序中,通过 MultiRunWorkerCompletedEventArgs对象获取处理结果信息。在事件处理程序中,一般遵循“ 先判断异步任务是否异常结束,接着判断是否执行了取消操作,最后访问处理结果 ”的步骤。

时间: 2024-08-08 00:15:21

实现增强的异步任务执行组件的相关文章

PostgreSQL 10.0 preview sharding增强 - 支持异步, 多节点并行

标签 PostgreSQL , 10.0 , sharding 增强 背景 PostgreSQL 10.0的sharding增强,比如聚合函数的下推算一个. 现在又带来了一个核武器级别的增强,postgres_fdw的异步化调用. 为什么说是核武器级别的呢,比如你有16个sharding节点(对应postgres_fdw的16个库),10.0以前,如果我需要执行一个QUERY涉及到所有的sharding节点时,每个sharding节点是串行执行的然后append结果. 10.0开始,会变成异步化

ios如何等待异步函数执行完成

问题描述 ios如何等待异步函数执行完成 iOS中如何等待异步函数执行完成之后再进行之后的操作 func getMovies() { let movieId:NSMutableArray = NSMutableArray() let path = "http://v.juhe.cn/movie/movies.today"; let api_id = "42"; let method = "GET"; let param = ["city

详解Android App中的AsyncTask异步任务执行方式_Android

基本概念 AsyncTask:异步任务,从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作.AsyncTask允许我们的执行一个异步的任务在后台.我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件.通过AsyncTask我们可以轻松的解决多线程之间的通信问题. 怎么来理解AsyncTask呢?通俗一点来说,AsyncTask就相当于Android给我们提供了一个多线程编程的一个框架,其介于Thread和Handler之间,我

Signar在管道内使用异步不执行await后的代码

问题描述 在给Signalr添加管道的时候,使用了异步,代码如下usingMicrosoft.AspNet.SignalR.Hubs;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingMicrosoft.AspNet.SignalR;usingSystem.Threading.Tasks;usingMongoDB.Driver;namespaceSignalRDemo.Models{

朱永光|Service Fabric简介与开发

备注:本分享将介绍Service Fabric--这一由微软出品的微服务框架的基本特性.开发模型.部署模式和运维相关知识.以期让大家对Service Fabric有个粗浅了解,即使不一定会在项目中采用,也可以给自己正在搭建的微服务平台提供一些灵感和参考.由于我最近的关注点在数据分析领域,所以对于Service Fabric也没有在项目中实际运用,所以只能分享Service Fabric的简单介绍,无法涉及具体的运用经验,就当作是官方文档的一个简化版本.同时本人水平有限难免有错漏,还请大家谅解.

PHP 异步执行方法,模拟多线程

PHP 本身没有多线程的东西,但可以曲线的办法来造就出同样的效果,比如多进程的方式来达到异步调用,只限于命令模式. 另外还有一种更简单的方式可用于 Web 程序中,那就是用 fsockopen().fputs() 来请求一个 URL, 而无需等待返回,如果你在那个被请求的页面(URL)中做些事情就相当于异步了. 关键代码如下: <?php $fp=fsockopen('localhost',80,&$errno,&$errstr,5); if(!$fp){ echo "$e

ASP.NET MVC下的异步Action的定义和执行原理

Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法.如果我们需要定义异步Action方法,必须继承抽象类AsyncController.这篇问你讲述两种不同的异步Action的定义方法和底层执行原理. 一.基于线程池的请求处理 ASP.NET通过线程池的机制处理并发的HTTP请求.一个Web应用内部维护着一个线程池,当探测到抵达的针对本应用的请求时,会从池

PHP 异步执行方法,模拟多线程的应用分析_php实例

PHP 本身没有多线程的东西,但可以曲线的办法来造就出同样的效果,比如多进程的方式来达到异步调用,只限于命令模式.另外还有一种更简单的方式可用于 Web 程序中,那就是用 fsockopen().fputs() 来请求一个 URL, 而无需等待返回,如果你在那个被请求的页面(URL)中做些事情就相当于异步了.关键代码如下: 复制代码 代码如下: <?php  $fp = fsockopen('localhost',80,&$errno,&$errstr,5);    if(!$fp)

详解ASP.NET MVC下的异步Action的定义和执行原理_实用技巧

Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法.如果我们需要定义异步Action方法,必须继承抽象类AsyncController.这篇问你讲述两种不同的异步Action的定义方法和底层执行原理. 一.基于线程池的请求处理 ASP.NET通过线程池的机制处理并发的HTTP请求.一个Web应用内部维护着一个线程池,当探测到抵达的针对本应用的请求时,会从池