《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并发编程的艺术> 第一章 介绍 线程的优势:充分利 ...
随机推荐
- ASP UserInfoList 方法1
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UserInfoList.a ...
- 数据绑定(六)使用XML数据作为Binding的Source
原文:数据绑定(六)使用XML数据作为Binding的Source .NET Framework提供了两套处理XML数据的类库 1. 符合DOM标准的类库:包括XmlDocument.XmlEleme ...
- delphi资源文件的使用
delphi资源文件的使用 资源文件(*.res)通过编译指令 $R 关联, 譬如工程文件 Project1 中的 {$R *.res} 就是关联 Project1.res 资源文件, 我们直接写作 ...
- Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法
原文:Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法 [函数名称] 高斯平滑滤波器 GaussFilter(WriteableBitmap src,int r ...
- HTML5离线缓存攻击测试
本实验采用局域网模拟,通过修改本地HOSTS文件来模拟域名以及DNS欺骗.合法网站使用Linux CentOS7的apache服务器搭建,IP为192.168.1.113,HOSTS文件中加入192. ...
- mfc开发an unsupported operation was attempted错误解决
mfc开发删除了一个控件后,没有删除该控件对应的id和代码导致 觉得mfc真xx 在资源编辑可视化界面手动删除一个控件后,resource.h里该控件的ID竟然还存在 因为该id还存在,调用该控件的代 ...
- ASP如何实现注册后发送激活邮件?
<% Sub Sendemail(title,content,email) Set jmail = Server.CreateObject("JMAIL.Message") ...
- C# 如何使用 Sql Server Compact 数据库
Sql Server Compact Edition(简称SqlCE)是一个轻量级的数据库,对于放在客户机上的程序而有需要存储数据这样的环境,使用SqlCE再合适不过了.SqlCE可以通过在VS(Vi ...
- .NET重思(一)sealed和interface
博主这几天正好闲着,砸砸基础,毕竟自学,基础不牢靠很致命,要踏实啊~~~ 1.sealed关键字修饰一个类,也可以修饰实现方法或者属性.当sealed用于修饰一个类时,这个类不可以被继承,因此,这个类 ...
- bootstrap模态框篇【遇到的问题】
<div class="modal fade" tabindex="-1" role="dialog"> <div cl ...