写点什么

Async/Await - 性能开销和其他陷阱

2013 年 7 月 25 日

Async/Await 是 C# 5 引入的最强大的语言特性。但有哪些陷阱需要注意呢?与这两个关键字相关的开销又有哪些?

MSDN 上的一篇文章“异步编程最佳实践”强调了以下几点:

  • 选择异步 Task 方法而非异步 void 方法,事件处理程序除外。它们采用不同的错误处理语义。 Marker Metro 的 Keith Patton详细解释了这一点
  • 避免混合使用阻塞和非阻塞代码,这可能会导致死锁、更加复杂的错误处理以及上下文线程的意外阻塞。
  • 如果后续代码不需要使用原始上下文,就用 ConfigureAwait(false) 来获得更好的性能。这会使后续代码运行在线程池上下文中。如果你不得不混合编写同步和异步的代码,它还可以避免死锁。注意,在服务端使用时会有略微不同的考虑

RedGate 的软件工程师 Chris Hurley 解释了 async-await 的 CPU 开销,并通过一小段示例代码进行了演示:

  • 用 async 关键字调用一个方法,会创建一个状态机,并构建一个 Task 对象来包含要执行的工作,以及获取执行上下文和同步上下文。
  • 在该展示示例中,第一次调用共运行了 963 个框架方法,来初始化相对简单的 async 方法。
  • 上下文将被缓存,因此后续调用会减少很多开销。
  • 对于在很短的时间内(1 毫秒)就能同步运行完的方法,异步开销将阻塞调用线程更长的时间。在示例中,调用线程解除阻塞差不多要用 45 毫秒的时间。即使在循环中,后续调用会大幅减少开销的情况下,调用线程也看不到任何性能优势。
  • 结论——避免对(耗时)短的方法使用 async/await,避免在小循环内使用 await 语句(可以将整个循环放到一个 async 方法内)。

我们之前已经介绍过一些在使用这两个关键字时会遇到的其他常见陷阱

查看英文原文: Async/Await – Performance Overheads and Other Pitfalls

2013 年 7 月 25 日 02:382897
用户头像

发布了 59 篇内容, 共 18.8 次阅读, 收获喜欢 3 次。

关注

评论

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

Golang Package sync 透析

卓丁

golang sync

拥抱K8S系列-05-基于docker部署面临的问题

张无忌

Docker 运维

Go: gops如何与Go运行时交互?

陈思敏捷

go golang gops

LeetCode题解:239. 滑动窗口最大值,单调队列,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

数字货币交易所开发方案|去中心化交易所搭建

WX13823153201

数字货币交易所开发

一点思考|工作十几年了,竟从未用过do-while!

王磊

Java

程序的机器级表示-数组的分配和访问

引花眠

计算机基础

ARTS打卡 第15周

引花眠

微服务 ARTS 打卡计划

oeasy教您玩转linux010206 蒸汽机车 sl

o

握草,你竟然在代码里下毒!

小傅哥

Java 程序员 小傅哥 bug 有毒代码

有奖征文重磅来袭,来!一起玩把大的!

有只小耳朵

商业通识 : 商业为什么能进步?

Walker

学习 得到 个人成长 商业

读后感之《任正非:以客户为中心》

王新涵

学习 Java,有什么书籍推荐?学习的方法和过程是怎样的?

沉默王二

Java 学习 程序员 书单

从湖南“软硬兼施”,管窥三湘水畔的智能浪潮

脑极体

Spring 5 中文解析测试篇-Spring测试

青年IT男

Spring5 JUnit

ARTS Week15

时之虫

ARTS 打卡计划

阿里巴巴发布国内首个公益区块链标准 用技术让公益公开透明

CECBC区块链专委会

区块链 公益

翻转链表,机器学习视觉训练,对数据的人工标注,使信息丢失,John 易筋 ARTS 打卡 Week 16

John(易筋)

学习 ARTS 打卡计划 翻转链表 Google论文评判人工预处理 大数据架构Spark

给大家介绍下,这是我的流程图软件 —— draw.io

程序员小航

工具 流程图 draw.io drawio-desktop 画图软件

给DevOps加点料——融入安全性的DevSecOps

禅道项目管理

DevOps 运维 测试 开发 安全性

3. 站在使用层面,Bean Validation这些标准接口你需要烂熟于胸

YourBatman

Hibernate-Validator Bean Validation 数据校验

架构师训练营第十三周总结

张明森

usdt跨境入金支付系统搭建|区块链跑分系统开发

WX13823153201

区块链交易所搭建技术方案|去中心化交易所开发

WX13823153201

区块链交易所搭建

甲方日常 8

句子

工作 随笔杂谈 日常

深入理解JVM垃圾回收机制 - GC Roots枚举

WANDEFOUR

GC Roots枚举 安全点 安全区域 OopMap

用函数式写法精简Java代码的一个例子

Sean

Java 函数式编程

透彻理解AQS源码分析系列之AQS基础二

InfoQ_d2212957090d

不支持原子性的 Redis 事务也叫事务吗?

海星

Java redis 事务

usdt支付系统开发|承兑商支付跑分系统搭建

WX13823153201

usdt支付系统开发

「中国技术开放日·长沙站」现场直播

「中国技术开放日·长沙站」现场直播

Async/Await - 性能开销和其他陷阱-InfoQ