FinOps有望降低企业50%+的云成本! 了解详情
写点什么

.NET 4.5 任务并行库改动与指南

  • 2012-03-30
  • 本文字数:1113 字

    阅读完需:约 4 分钟

在.NET 4.0 中,Task 类暴露了 IDisposable 接口。Task 可被回收(disposable)是为了清理 IAsyncResult 接口中 AsyncWaitHandle 属性暴露的等待句柄(wait handle)。在.NET 4.0 中,等待句柄只有在读取 AsyncWaitHandle 属性,或者使用 Task.WaitAll、Task.WaitAny 时才会被创建,其他情况调用 Task.Dispose 都是多余的。

遗憾的是,.NET 4.0 中的 Task 在处理 ObjectDisposedException 时显得过于武断:一旦调用 Dispose 释放等待句柄之后,即使其他属性与之毫无联系,剩余对象也会变得不稳定。

那么在.NET 4.0 中是否应该调用 Task.Dispose?

不应该,除非遇到以下情况:

  1. 整个 Task 不会被缓存;
  2. 等待句柄是通过调用 Task.WaitAll、Task.WaitAny,或是读取 IAsyncResult.AsyncWaitHandle 创建而成;
  3. Task 上没有其他任务或线程处于等待状态。

其实,即使所有的条件都满足,你也不用做什么,因为终结器 (finalizer)在清理等待句柄方面已经做了相同高效的工作。所以,除非你看到一些性能问题,否则你也许可以仍然不用回收 task。

.NET 4.5 核心中的改动

在.NET 4.5 中,只有显式读取 IAsyncResult.AsyncWaitHandle 时,内部等待句柄才会被创建。其他部分,包括 Task.WaitAll 和 Task.WaitAny 都进行了重新设计,它们不再需要等待句柄。另外,随着语言中对 async/await 的支持,IAsyncResult 在大部分场景中甚至都不再需要。

.NET 4.5 中 Task 的另外一个改动是 task 在释放之后仍然可用。按照Stephen Toub 的说法,“现在,即使Task 释放之后也可以使用它的所有公开成员,并且它们使用起来就和释放之前一样。唯一一个不能使用的成员是IAsyncResult.AsyncWaitHandle,因为它是Task 实例真正释放的部分。如果试图在Task 释放后访问该属性,它会抛出一个ObjectDisposedException 异常。”

虽然在.NET 4.5 中调用Task.Dispose 变得更加安全,但是几乎没有理由需要这么做。

针对.NET 4.5 Metro 的特殊规则

Stephen Toub 接着提到 Task.Dispose 在“.NET Metro 风格应用程序”框架中甚至并不存在。要注意的是,目前关于此项设计变更的信息还未在 WinRT 的 Task 文档中更新反映。

从函数返回 Task

在另外一篇题为“是否应当为同步方法暴露异步包装?“的文章中,Stephen 深度探讨了从函数返回 Task 对象的话题。我们推荐你阅读全篇文章,而如果你时间不充裕,可以阅读以下的总结部分:

我认为只有那些异步方法比对应的同步方法拥有可扩展性(scalability)优势时才应当被暴露。异步方法不应当为了单纯地减轻负载(offloading)而进行暴露,因为这类优势可以通过使用专门用于异步执行同步方法的功能轻松实现,如使用 Task.Run。

查看英文原文: Changes and Guidance for the Task Parallel Library in .NET 4.5

2012-03-30 10:012504
用户头像

发布了 125 篇内容, 共 33.7 次阅读, 收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

在线CSS代码压缩美化工具

入门小站

工具

架构实战营 - 模块 5- 设计微博系统中”微博评论“的高性能高可用计算架构

蔸蔸

老和云起小游

箭上有毒

8月日更

模块五作业-微博评论-高性能高可用架构

babos

#架构实战营

架构实战营 模块五 作业

三叔叔_拖延症晚期

架构实战营 - 模块 5 - 微博评论的高性能高可用计算架构

雪中亮

架构实战营 #架构实战营

模块五作业

绝影

架构训练营

架构实战营 模块五 作业

脉醉

#架构实战营

[架构实战营] 模块五作业

xyu

#架构实战营

iOS开发:Xcode报错“Could not insert new outlet connection:Could not find any...”问题的解决方法

三掌柜

8月日更 8月

百度助力人工智能教育创新:教育部产学合作协同育人项目申报进行中!

百度大脑

人工智能

JavaScript 数组元素的一些操作

HoneyMoose

架构实战训练营第五模块作业

子豪sirius

架构实战营

架构训练营模块五作业

喻高咏        

模块五作业 - 微博评论的高性能高可用计算架构

君子意如何

「架构师训练营第 1 期」

模块5作业

脉动

设计微博系统中”微博评论“的高性能高可用计算架构

木云先森

架构训练营

模块五-微博评论“的高性能高可用计算架构

柱林

模块五作业

VE

架构实战营

MongoDB中间件工具mgm入门介绍(一)

liuzhen007

8月日更

模块五作业

Testcase

架构实战营

架构实战营模块5作业

技术是伙伴

架构实战营

模块5 作业

SAKIN

HBase 原理、Shell、API读写操作

Mike

【设计模式】策略模式

Andy阿辉

C# 后端 设计模式 8月日更

微博评论高性能高可用方案设计

gawaine

架构实战营

模块五作业

河马先生

架构实战营

四种引用类型在Springboot中的使用

4ye

Java spring 后端 springboot 8月日更

有同学问我:Fetch 和 Ajax 有什么区别?

编程三昧

JavaScript ajax 大前端 8月日更 Fetch

【架构训练营】模块五作业

zclau

架构实战营模块五作业

老猎人

架构实战营

  • 需要帮助,请添加网站小助手,进入 InfoQ 技术交流群
.NET 4.5任务并行库改动与指南_.NET_Jonathan Allen_InfoQ精选文章