BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Jonathan Allen 关注 530 他的粉丝 ,译者 赵劼 关注 4 他的粉丝 发布于 2009年11月16日. 估计阅读时间: 3 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

.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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

内容有误 by Jeffrey Zhao

OperationCanceledException不是靠任务抛出的,任务只要停止,不继续处理就行了。
而是在响应任务的代码中,需要处理框架抛出的OperationCanceledException。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT