ConfigureAwait(false)避免上下文延续

之前MVC利用MvcHtmlString封装通用下拉菜单,菜单数据需要从webapi获取,自然用到了 await Http Client.GetAsync(Url)方法,前端 @Html.SelectCategory调用的时候会发生死锁。

默认情况下,一个asynchronous方法在被await调用后恢复运行时,会在原来的上下文运行,如果是UI上下文,并且有大量的asynchronous方法在UI上下文中回复,就会引起性能问题。死锁也是这么造成的。

解决方法 :加一个.ConfigureAwait(false),为了避免在上下文钟恢复运行,可让await调用ConfigureAwait方法的返回值,参数continueOnCapturedContext设为false

时间: 2024-10-16 09:28:29

ConfigureAwait(false)避免上下文延续的相关文章

Async/Await 异步编程中的最佳做法

近日来,涌现了许多关于 Microsoft .NET Framework 4.5 中新增了对 async 和 await 支持的信息. 本文旨在作为学习异步编程的“第二步”:我假设您已阅读过有关这一方面的至少一篇介绍性文章. 本文不提供任何新内容,Stack Overflow.MSDN 论坛和 async/await FAQ 这类在线资源提供了同样的建议. 本文只重点介绍一些淹没在文档海洋中的最佳做法. 本文中的最佳做法更大程度上是“指导原则”,而不是实际规则. 其中每个指导原则都有一些例外情况

异步编程中的最佳做法

原文链接 近日来,涌现了许多关于 Microsoft .NET Framework 4.5 中新增了对 async 和 await 支持的信息. 本文旨在作为学习异步编程的“第二步”:我假设您已阅读过有关这一方面的至少一篇介绍性文章. 本文不提供任何新内容,Stack Overflow.MSDN 论坛和 async/await FAQ 这类在线资源提供了同样的建议. 本文只重点介绍一些淹没在文档海洋中的最佳做法. 本文中的最佳做法更大程度上是“指导原则”,而不是实际规则. 其中每个指导原则都有一

异步编程中的最佳做法(Async/Await) --转

近日来,涌现了许多关于 Microsoft .NET Framework 4.5 中新增了对 async 和 await 支持的信息. 本文旨在作为学习异步编程的“第二步”:我假设您已阅读过有关这一方面的至少一篇介绍性文章. 本文不提供任何新内容,Stack Overflow.MSDN 论坛和 async/await FAQ 这类在线资源提供了同样的建议. 本文只重点介绍一些淹没在文档海洋中的最佳做法. 本文中的最佳做法更大程度上是“指导原则”,而不是实际规则. 其中每个指导原则都有一些例外情况

探究SynchronizationContext在.Net异步编程中的地位

原文:探究SynchronizationContext在.Net异步编程中的地位 引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/async异步编程语法糖简化了异步编程方式. 相信很多开发者都看到如下异步编程实践原则:   实践原则  说明  例外情况  ①  避免 Async Void  最好使用 async Task 方法而不是 async void 方法  事件处理程序  ②  始终使用 await  不要混合阻塞式代码和

异步编程之Async,Await和ConfigureAwait的关系

在.NET Framework 4.5中,async / await关键字已添加到该版本中,简化多线程操作,以使异步编程更易于使用.为了最大化利用资源而不挂起UI,你应该尽可能地尝试使用异步编程.虽然async / await让异步编程更简单,但是有一些你可能不知道的细节和注意的地方  新关键字 微软在.NET框架中添加了async和await关键字.但是,使用它们,方法的返回类型应为Task类型.(我们将在稍后讨论例外情况)为了使用await关键字,您必须在方法定义中使用async.如果你在方

# ConfigureAwait常见问题解答

原文: https://devblogs.microsoft.com/dotnet/configureawait-faq/ .NET 在七多年前在语言和类库添加了 async/await .在那个时候,它像野火一样流行,不仅遍及.NET生态系统,而且还可以以多种其他语言和框架进行复制.在利用异步的其他语言构造,提供异步支持的API以及进行async/ await相关的基础架构方面的基本改进方面,.NET也实现了很多改进(特别是.NET Core的性能和支持诊断的改进) . 但是,async/ a

Async/Await Context 与 ConfigureAwait

Context 当你await一个awaitable对象的时候,编译器会捕捉当前的context,并且在执行await之后的代码时应用这个context. 那么,context具体是什么呢? 简单地说: 1. 如果你在一个UI线程上,那么context就是一个UI context 2. 如果你在相应ASP.NET Request的线程上,那么它就是一个ASP.NET request context 3. 否则,它就是一个thread pool context 更加准确点说 1. 如果Synchr

Task.ConfigureAwait

public ConfiguredTaskAwaitable ConfigureAwait( bool continueOnCapturedContext ) Configures an awaiter used to await this Task. Parameters continueOnCapturedContext Type: System.Boolean true to attempt to marshal the continuation back to the original

async/await学习笔记

async/await特性 异步方法 包含async修饰符 该修饰符只用于标示这个方法有await表达式 至少包含一个await表达式 返回类型必须为下面这三种 void//尽量别用 Task Task<T> Task类代表这次的异步任务,能从Task中获得任务状态,Task用于表示会返回T类型值的任务 参数不能有out,ref 命名约定:以Async结尾 异步方法的控制流 //调用方法 static void Main(string[] args) { Console.WriteLine(&