《C#并发编程经典实例》学习笔记—2.7 避免上下文延续
避免上下文延续
在默认情况下,一个 async 方法在被 await 调用后恢复运行时,会在原来的上下文中运行。
为了避免在上下文中恢复运行,可让 await 调用 ConfigureAwait 方法的返回值,参数 continueOnCapturedContext 设为 false :
async Task ResumeOnContextAsync () {
await Task.Delay (TimeSpan.FromSeconds (1));
// 这个方法在同一个上下文中恢复运行。
}
async Task ResumeWithoutContextAsync () {
await Task.Delay (TimeSpan.FromSeconds (1)).ConfigureAwait (false);
// 这个方法在恢复运行时,会丢弃上下文。
}
可能导致性能问题
作者Stephen提到,当在UI线程大量使用async方法,可能需要考虑线程切换导致上下文恢复导致的性能消耗。当然性能消耗问题不会是单一的原因导致,代码的优化永无止境。
可能会有人对性能消耗的理解不太具体,大概解释一下,async方法会生成一个状态机,该状态机可能是一个class或者struct用来存储上下文信息,这些都要消耗存储空间和进行后续的GC回收。
关于状态机的更多信息可以访问《C#并发编程经典实例》学习笔记—异步编程关键字 Async和Await 查看。
Stephen提到UI线程中如果每秒有1000个任务就太多了。这个结论来自于视频Tip 6: Async library methods should consider using Task.ConfigureAwait(false)
避免使用不当导致死锁
文章Talk: Async best practices给出的第6条建议提到作为一个类库提供者,应该需要注意ConfigureAwait的问题,避免该类库的使用者在UI线程使用该类库时产生额外的性能消耗。还提到类库使用者对异步方法不当的使用时将会导致死锁,而避免该类死锁的最佳办法是,参数
continueOnCapturedContext 设为 false 即使用ConfigureAwait (false)。
个人总结一下不当的使用包括但不限于以下几类:
- 同步方法中使用异步方法。所以一个类库的提供者,应尽量提供一个方法的同步实现和异步实现,并在异步实现中使用
ConfigureAwait (false)。 - 在UI线程使用
Task.Wait()或者Task.Result。
参考文章:
- https://blog.walterlv.com/post/deadlock-in-task-wait.html
- https://blog.walterlv.com/post/using-configure-await-to-avoid-deadlocks.html
- https://blogs.msdn.microsoft.com/lucian/2013/02/17/talk-the-new-async-design-patterns/
《C#并发编程经典实例》学习笔记—2.7 避免上下文延续的更多相关文章
- 《C#并发编程经典实例》笔记
1.前言 2.开宗明义 3.开发原则和要点 (1)并发编程概述 (2)异步编程基础 (3)并行开发的基础 (4)测试技巧 (5)集合 (6)函数式OOP (7)同步 1.前言 最近趁着项目的一段平稳期 ...
- 《C#并发编程经典实例》学习笔记—3.1 数据的并行处理
问题 有一批数据,需要对每个元素进行相同的操作.该操作是计算密集型的,需要耗费一定的时间. 解决方案 常见的操作可以粗略分为 计算密集型操作 和 IO密集型操作.计算密集型操作主要是依赖于CPU计算, ...
- 《C#并发编程经典实例》学习笔记—2.3 报告任务
问题 异步操作时,需要展示该操作的进度 解决方案 IProgress<T> Interface和Progress<T> Class 插一段话:读<C#并发编程经典实例&g ...
- 《C# 并发编程 · 经典实例》读书笔记
前言 最近在看<C# 并发编程 · 经典实例>这本书,这不是一本理论书,反而这是一本主要讲述怎么样更好的使用好目前 C#.NET 为我们提供的这些 API 的一本书,书中绝大部分是一些实例 ...
- [书籍]用UWP复习《C#并发编程经典实例》
1. 简介 C#并发编程经典实例 是一本关于使用C#进行并发编程的入门参考书,使用"问题-解决方案-讨论"的模式讲解了以下这些概念: 面向异步编程的async和await 使用TP ...
- 《C#并发编程经典实例》学习笔记-关于并发编程的几个误解
误解一:并发就是多线程 实际上多线程只是并发编程的一种形式,在C#中还有很多更实用.更方便的并发编程技术,包括异步编程.并行编程.TPL 数据流.响应式编程等. 误解二:只有大型服务器程序才需要考虑并 ...
- 《C#并发编程经典实例》学习笔记-第一章并发编程概述
并发编程的术语 并发 同时做多件事情 多线程 并发的一种形式,它采用多个线程来执行程序. 多线程是并发的一种形式,但不是唯一的形式. 并行处理 把正在执行的大量的任务分割成小块,分配给多个同时运行的线 ...
- 并发编程概述--C#并发编程经典实例
优秀软件的一个关键特征就是具有并发性.过去的几十年,我们可以进行并发编程,但是难度很大.以前,并发性软件的编写.调试和维护都很难,这导致很多开发人员为图省事放弃了并发编程.新版.NET 中的程序库和语 ...
- 《Java并发编程实战》学习笔记 线程安全、共享对象和组合对象
Java Concurrency in Practice,一本完美的Java并发参考手册. 查看豆瓣读书 推荐:InfoQ迷你书<Java并发编程的艺术> 第一章 介绍 线程的优势:充分利 ...
随机推荐
- .net core config读取
最简单的方式 引用 Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.Json json文件 新建一个Conf ...
- Ionic3开发环境搭建-VS Code
原文:Ionic3开发环境搭建-VS Code 一.Ionic3在VS Code中的开发环境搭建 1.全局安装Ionic包 npm install -g cordova ionic 使用 ionic ...
- InnoSetup提升系统管理员权限(通过破解方式修改?)
PrivilegesRequired=admin 1 2 3 4 5 找到```INNO```安装目录下的```SetupLdr.e32```文件(其实就是一个exe程序),将程序中的```Man ...
- 安卓ImageButton圆角按钮设置
首先图片要做成圆角的,使用美图秀秀,这个不多说. 之后使用设置了圆角的按钮,效果有缺陷,按钮会有灰色的边角. 类似这样: 去掉的方法是将layout的 android:src="@draw ...
- storm和kafka的wordCount
这个是在window环境下面安装的kafka 下载pom依赖 <dependency> <groupId>org.apache.storm</groupId> &l ...
- Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)
一.ActiveX应用情况简介: ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分.ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32 ...
- 《KVM虚拟化技术实战和原理解析》读书笔记(十几篇)
第一章和第二章 第一章 虚拟化和云计算 Saas(软件即服务):将已经部署好的软件作为一种服务来提供,比如:Google Docs, Google Apps Paas(平台即服务):将开发环境作为一种 ...
- Ruby已经慢慢走向衰退了,那些年代久远而且小众的语言没有翻身的可能性
Ruby已经慢慢走向衰退了,现在WEB开发里,NODE.JS+前端各种框架是主流,PHP.ruby.Asp.net.python等语言在网站编程方面只会越来越少.数据领域方面,机器学习和人工智能中,p ...
- Windows开机自启动位置
HKCU refers to HKEY_CURRENT_USERHKLM refers to HKEY_LOCAL_MACHINE HKCU\Software\Microsoft\Windows\Cu ...
- 使用MinGW编译Boost,MSVC编译Boost的几种链接方式 good
1.下载Boost(http://www.boost.org) 我目前用的是1.61.0版本 2.将MinGW下的bin目录完整路径设置到系统环境变量Path中,保证cmd命令行能找到gcc,g++等 ...