《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并发编程的艺术> 第一章 介绍 线程的优势:充分利 ...
随机推荐
- WPF Binding Path妙用代码实现
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- 读BeautifulSoup官方文档之与bs有关的对象和属性(2)
上一节说到tag, 这里接着讲, tag有个属性叫做string, tag.string其实就是我们要掌握的四个对象中的第二个 ---- NavigableString, 它代表的是该tag内的te ...
- linux系统的ssh服务开启方法
操作方法: 1.编辑sshd_config文件 root@linux:~# vi /etc/ssh/sshd_config 2.检查如下配置项: PasswordAuthentication ye ...
- Flutter 开发环境搭建
Flutter 开发环境搭建 官方的资料相对还是比较全面的,包含了很多中文的资料信息.官方对咱们国家的开发人员还是很友好的. 安装教程:https://flutter.io/get-started/i ...
- 【shell】编译脚本
#!/bin/bash #设置环境变量 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export JRE_HOME=${JAVA_HOME}/ ...
- Android零基础入门第44节:ListView数据动态更新
原文:Android零基础入门第44节:ListView数据动态更新 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据都是 ...
- 关于DDD领域驱动设计的理论知识收集汇总
原文:关于DDD领域驱动设计的理论知识收集汇总 最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一 ...
- WebApi实现验证授权Token,WebApi生成文档等 - CSDN博客
原文:WebApi实现验证授权Token,WebApi生成文档等 - CSDN博客 using System; using System.Linq; using System.Web; using S ...
- SQL Server 将某一列的值拼接成字符串
名称 海鲜水产 水果蔬菜 海参 肉禽蛋 牛排 腊味 生鲜食品 将以上一列变成: 生鲜食品,海鲜水产,水果蔬菜,海参,牛排,肉禽蛋,腊味 sql for xml path('')
- Unity开发概览(HoloLens开发系列)
本文翻译自:Unity development overview 要开始使用Unity创建全息应用,点此安装包含Unity HoloLens技术预览的开发工具.Unity HoloLens技术预览基于 ...