当当前同步上下文已经是线程池上下文时,await 是否尝试捕获上下文?



示例:

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异步操作,在线程池上下文中恢复;Method3Method4在线程池上下文中启动,其await在线程池上下文中恢复。

但是,如果Method2返回的任务在await检查它时完成,则该await同步操作,保留在 ASP.NET 上下文中;Method3Method4从 ASP.NET 上下文开始,他们的await在 ASP.NET 上下文中恢复。

正是出于这个原因,我建议一旦await在方法中使用ConfigureAwait(false),该方法中所有后来的await也使用ConfigureAwait(false)

最新更新