【发布时间】:2021-03-28 10:53:12
【问题描述】:
试图了解何时应该使用ConfigureAwait()。
根据书:
当
async方法在等待后恢复时,默认情况下它将在同一上下文中恢复执行。如果该上下文是 UI 上下文并且大量异步方法正在 UI 上下文上恢复,这可能会导致性能问题。
解决方案
为避免在上下文中恢复,等待ConfigureAwait() 的结果并为其continueOnCapturedContext 参数传递false:
async Task ResumeWithoutContextAsync()
{
await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false);
//This method discards its context when it resumes.
}
什么是上下文以及如何查看ConfigureAwait() 更改示例应用程序中的内容:
static async Task ResumeWithoutContextAsync()
{
await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(true);
Console.WriteLine("ManagedThreadId {0}", Thread.CurrentThread.ManagedThreadId);
//This method discards its context when it resumes.
}
static void Main(string[] args)
{
ResumeWithoutContextAsync();
Console.ReadLine();
}
我以为上下文是Thread,但不是。
【问题讨论】:
-
有一个术语叫“阻塞”。一些方法在工作完成时同步(阻塞)返回,而另一些方法是异步的(非阻塞)并在所有工作完成之前返回。当方法是非阻塞的并且你需要等到所有工作完成时才需要等待。
标签: c# asynchronous