介绍任务并行库中新增的取消框架

.NET 4的任务并行类库在beta 2中有了新面貌。这个类库与传统的ThreadPool相比提供了更好的性能和功能。其中一个改进便是解决了ThreadPool在任务取消方面的不足。众所周知,目前的线程池并不提供一种有效地方式来取消那些已经创建的任务。

任务并行库从一开始便提供了对任务取消的支持,不过beta 2版本中从实现和API上都引入了重要的改变。新的取消模型引入了CancellationTokenSource,其中包含一个CancellationToken对象。这样一来Task对象便不需要Cancel、AcknowledgeCancellation、IsCancellationRequested、Current、Parent以及TaskCreationOptions.RespectParentCancellation枚举器等成员。与此相对,许多方法已经提供了一个可选的,包含CancellationToken作为参数的重载版本。

希望取消一个或多个任务的对象需要持有一个CancellationTokenSource对象,而一个响应取消操作的任务也需要持有CancellationToken,并且有规律地检查它的IsCancellationRequested属性。多个任务可以共用同一个CancellationToken。在得到任务取消的请求之后,每个任务需要抛出OperationCanceledException。

在过去的beta版本中,任务之间自然维护着父/子关系。这个关系和它们产生的行为是自然建立的,除非开发人员显式地进行剥离。在beta 2中使用相反的做法。父/子关系在默认情况下并不会出现,除非开发人员显式地进行确认。

如果你确认了父/子任务,那么你同样获得原有的一些特性,如异常传播,父任务等待子任务完成。如果你不这么做,任务就和传统的ThreadPool工作项差不多了。

就像大部分没有处理的异常那样,没有得到“关注”的TPL异常会让应用程序崩溃。如果要对异常进行“关注”,你必须在调用任务的Wait方法时捕获异常,或者在任务被垃圾回收之前检查其Exception属性。Beta 2增加了一个新的选项,即UnobservedTaskException事件,这给了开发人员最后得机会来避免异常造成实际的破坏。

你可以在.NET并行计算博客中了解更多Beta 2中的改进。

查看英文原文:Introducing the Task Parallel Library’s new Cancellation Framework

你可能感兴趣的:(介绍任务并行库中新增的取消框架)