草庐IT

ConfigureAwait

全部标签

c# - 使用 ConfigureAwait(false) 和 Task.Run 有什么区别?

我知道建议对库代码中的await使用ConfigureAwait(false),这样后续代码就不会在调用者的执行上下文中运行,这可能是一个UI线程。我也明白,出于同样的原因,应该使用awaitTask.Run(CpuBoundWork)而不是CpuBoundWork()。ConfigureAwait示例publicasyncTaskLoadPage(Uriaddress){using(varclient=newHttpClient())using(varhttpResponse=awaitclient.GetAsync(address).ConfigureAwait(false))us

【C#/.NET】探究Task中ConfigureAwait方法

​ 目录 引言ConfigureAwait方法的作用和原理ConfigureAwait方法的使用场景非UI线程场景避免上下文切换避免死锁ConfigureAwait方法的注意事项在UI线程使用时需要小心嵌套搭配使用总结 引言        在.NET开发中,我们经常使用异步编程来提高应用程序的性能和响应能力。而在异步编程中,ConfigureAwait方法是一个非常重要的方法,它可以对任务(Task)的上下文进行配置,从而影响任务的执行和调度。本篇博客将深入探究ConfigureAwait方法的作用和用法,帮助读者更加准确地理解和使用这个方法。ConfigureAwait方法的作用和原理   

c# - 为所有服务器端代码调用 ConfigureAwait 的最佳实践

当你有服务器端代码(即一些ApiController)并且你的函数是异步的-所以它们返回Task-任何时候你等待你调用的函数是否被认为是最佳实践ConfigureAwait(false)?我读到它的性能更高,因为它不必将线程上下文切换回原始线程上下文。但是,对于ASP.NETWebApi,如果您的请求是在一个线程中传入的,并且您等待某个函数并调用ConfigureAwait(false)当您返回ApiController的最终结果时,这可能会将您置于不同的线程中功能。我在下面打了一个例子:publicclassCustomerController:ApiController{publi

c# - 为所有服务器端代码调用 ConfigureAwait 的最佳实践

当你有服务器端代码(即一些ApiController)并且你的函数是异步的-所以它们返回Task-任何时候你等待你调用的函数是否被认为是最佳实践ConfigureAwait(false)?我读到它的性能更高,因为它不必将线程上下文切换回原始线程上下文。但是,对于ASP.NETWebApi,如果您的请求是在一个线程中传入的,并且您等待某个函数并调用ConfigureAwait(false)当您返回ApiController的最终结果时,这可能会将您置于不同的线程中功能。我在下面打了一个例子:publicclassCustomerController:ApiController{publi

c# - async/await 与 ConfigureAwait 的 continueOnCapturedContext 参数和用于异步延续的 SynchronizationContext

我想先放代码,然后说明情况,并据此提出我的问题:publicpartialclassMainWindow:Window{publicMainWindow(){InitializeComponent();}privateasyncvoidButton_Click_2(objectsender,RoutedEventArgse){varresult=awaitGetValuesAsync();Foo.Text+=result;}publicasyncTaskGetValuesAsync(){using(varhttpClient=newHttpClient()){varresponse=a

c# - 异步库最佳实践 : ConfigureAwait(false) vs. 设置同步上下文

众所周知,在通用库中,ConfigureAwait(false)应该在每次await调用时使用,以避免在当前SynchronizationContext上继续。作为用ConfigureAwait(false)填充整个代码库的替代方法,可以在公共(public)表面方法中简单地将SynchronizationContext设置为null一次,然后在返回给用户之前将其恢复。换句话说:publicasyncTaskSomeSurfaceMethod(){varcallerSyncCtx=SynchronizationContext.Current;SynchronizationContext

c# - 为整个项目/dll 设置 ConfigureAwait(false)

AccordingtoanarticleinMSDNMagazine,最好的做法是“尽可能使用ConfigureAwait(false)”。此外,它指出,“如果您可以在方法中的某个时刻使用ConfigureAwait,那么我建议您在该时刻之后对该方法中的每个await使用它。”StephenCleary,那篇文章的作者,statesonhisblog“在您的‘库’异步方法中,尽可能使用ConfigureAwait(false)[强调]。”鉴于我的大部分或所有await语句在一个旨在被广泛使用的库项目中应该具有.ConfigureAwait(false)是否有可能做一些事情/更改设置以使

c# - 我什么时候应该使用 ConfigureAwait(true)?

有没有人遇到过使用ConfigureAwait(true)的场景?因为true是默认选项,所以我不知道你什么时候会使用它。 最佳答案 true尝试将延续编码回捕获的原始上下文;否则为假。实际上更像是说ConfigureAwait(true)就像使用.ContinueWith(t=>{...},TaskScheduler.FromCurrentSynchronizationContext()),其中ConfigureAwait(false)就像使用.ContinueWith(t=>{...})。如果传递false,则允许继续在线程池线

c# - 为什么我需要在所有传递闭包中使用 ConfigureAwait(false)?

我正在学习async/await,在阅读这篇文章后Don'tBlockonAsyncCode还有这个Isasync/awaitsuitableformethodsthatarebothIOandCPUbound我注意到@StephenCleary的文章中的一个提示。UsingConfigureAwait(false)toavoiddeadlocksisadangerouspractice.YouwouldhavetouseConfigureAwait(false)foreveryawaitinthetransitiveclosureofallmethodscalledbythebloc

c# - 我们应该在调用异步回调的库中使用 ConfigureAwait(false) 吗?

关于何时使用ConfigureAwait(false)有很多指南,在C#中使用await/async时。似乎一般建议使用ConfigureAwait(false)在库代码中,因为它很少依赖于同步上下文。但是,假设我们正在编写一些非常通用的实用程序代码,它将一个函数作为输入。一个简单的示例可能是以下(不完整的)功能组合器,以简化基于任务的简单操作:map:publicstaticasyncTaskMap(thisTasktask,Funcmapping){returnmapping(awaittask);}平面map:publicstaticasyncTaskFlatMap(thisTa