示例:
public async Task Method1()
{
//uses ASPNetSynchronisationContext
await Method2().ConfigureAwait(false);
//uses ThreadPoolContext as we didn't capture the context above
await Method3();
//uses ThreadPoolContext
await Method4();
}
我的问题是,"等待方法3()"是否试图捕获上下文?无论如何,Method4 都使用 ThreadPool 上下文。
答案取决于Method2
返回的是已完成还是未完成的任务。
正如我在async
介绍中所描述的,await
将首先检查其参数以确定它是否已经完成,如果已完成,那么它将继续同步执行。如果尚未完成,则await
将异步操作,其中包括(Task
秒)捕获上下文。
因此,如果Method2
返回的任务在await
检查它时尚未完成,则该await
异步操作,在线程池上下文中恢复;Method3
和Method4
在线程池上下文中启动,其await
在线程池上下文中恢复。
但是,如果Method2
返回的任务在await
检查它时完成,则该await
同步操作,保留在 ASP.NET 上下文中;Method3
和Method4
从 ASP.NET 上下文开始,他们的await
在 ASP.NET 上下文中恢复。
正是出于这个原因,我建议一旦await
在方法中使用ConfigureAwait(false)
,该方法中所有后来的await
也使用ConfigureAwait(false)
。