C#命令式任务并行开发

来源:互联网 发布:如何申请手机淘宝账号 编辑:程序博客网 时间:2024/04/28 22:08

相对于多线程的并行开发,任务式并行是一种更为轻量级的并行模式。

这里的任务不是线程,当然,任务运行的时候需要使用线程,我们不妨把任务当做一个处理事件的单元,一个线程中可以执行多个这样的单元。我将通过两个图来对比任务和线程,如下:

如图,除了主线程之外,我们又创建了7个线程来处理7个操作,这里的每个线程执行时间不同。假定我们的计算机是四核,那么系统不得不通过并发的形式来执行多个线程,同时我们又不得不考虑创建多个线程本身的开销问题。如果我们将每一个需要处理的操作当成一个任务单元,通过任务式并行模式进行开发,如图:

任务代码是使用底层的线程运行的,然而,任务和线程之间并没有一对一的关系。也就是说,并不是在每创建一个新任务的时候都会创建一个线程。通过运行时会创建必要的线程来支持任务执行的需求。

实际上,默认的任务调度器是依赖于底层的线程池引擎。在创建一个新任务时,调度器会使用工作窃取队列找到一个最合适的线程,然后将任务加入队列。任务中所包含的代码会在一个线程中运行;然而这一切都是在幕后进行的,其开销的确比手工创建新线程要小很多。

接下来,我们来看下TPL运行库给我们提供的基于任务的并行实例。

TPL提供了System.Threading.Tasks.Task的实例,当调用Parallel.Invoke的时候,TPL也会创建与调用的委托数目一致的实例。

一个Task表示一个异步操作也就是一个任务单元。Task的属性如下:

AsyncState:当创建Task实例时提供的状态对象。

CreationOptions:当创建Task实例时提供的TaskCreationOptions值,该值能够为任务调度器给出一些提示,从而帮助任务调度器做出正确的调度动作。

CurrentId:当前正在执行的Task的唯一ID。这里不等同于线程的ID,是一个静态属性,应该只有在调式的时候使用这个属性。

Exception:Task的异常属性。

Factory:通过这个属性能够访问创建带有结果或不带有结果的Task实例的工厂方法,是一个静态属性。当我们不希望通过new创建Task实例时,可以使用此属性。

Id:Task实例的唯一ID

IsCanceled:布尔值,表示这个Task实例是否被取消了。

IsCompleted:布尔值,表示这个Task实例是否完成了执行。

IsFaulted:布尔值,表示这个Task实例是否因为一个未处理的异常而终止执行了。

Status:TaskStatus值,表示这个Task实例当前在生命周期中所处的阶段。

这里,不得不重点提一下,通过Task实例可以实现多个任务的延续执行。Task提供了一个ContinueWith()方法用来延续下一个Task。

 

0 0
原创粉丝点击