BT

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

.NET 4.6中新的任务并行库特性

| 作者 Jonathan Allen 关注 594 他的粉丝 ,译者 邵思华 关注 3 他的粉丝 发布于 2015年2月25日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

在即将发布的.NET 4.6中,.NET中的任务并行库将会进行某些调整。其中会包括一些新的帮助方法以减少代码量,可能还会有性能方面的优化。除此之外,TPL将会通过使用一个新的解决方案对SetResult方法中某个复杂的问题进行处理。

可以将Task.FromResult视为一个典型样板,这一函数用于创建一个已经完成的Task对象,而无需首先创建一个TaskCompletionSource对象。开发者无法模拟这一效果,因此这需要访问Task类型的内部实现,如果你希望在异常处理时达到同样的效果,以上缺陷就将会成为一个阻碍。

.NET 4.6通过Task.FromException方法解决了这一问题。与FromResult类似,它能够绕过TaskCompletionSource这一机制的使用,并避免了随之而来的各种消耗。

与之相关的一个特性是Task.CompletedTask属性,该属性会返回一个完成的Task对象,而在目前的版本中只能通过Task.FromResult<object>(null)实现。严格来说,这一特性并非十分必要,但它确实能够让开发者的意图变得更加清晰一些了。

与最后一个重要的特性相比,以上所介绍的这些新特性的效果可谓微不足道。TaskCompletionSource.SetResult方法有一个已知的行为,即如果该方法的后续方法会挂起对应的Task对象的话,那么这些后续方法有可能会以同步方式进行运行。Stephen Toub为读者解释了为什么这一行为可能会出现问题:

我曾说过对TaskCompletionSource<TResult>调用{Try}Set*等方法可能会产生的一种结果,即该TaskCompletionSource<TResult>对象所对应的Task对象的任何同步后续方法会以同步方式运行,成为整个方法调用的一部分。如果我们在持有锁的同时调用了SetResult方法,那么该Task对象的同步后续方法会在持有锁的情况下运行,这可能会导致真正的问题。因此,在持有锁的情况下,我们需要将TaskCompletionSource<bool>设为completed,但我们实际上并没有完成它,而是将完成动作延迟,直至锁被释放之后。

为了避免这一情况的产生,开发者可以在创建TaskCompletionSource时,使用RunContinuationsAsynchronously这一新的标记:

tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously)

.NET 4.6将会与Visual Studio 2015一起发布。

查看英文原文:New Task Parallel Library Features in .NET 4.6

评价本文

专业度
风格

您好,朋友!

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

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的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通知我

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

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

讨论

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


找回密码....

Follow

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

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

Like

内容自由定制

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

Notifications

获取更新

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

BT