想象一下调用者创建任务时的情境:
{
var tWithCapturedCtx = Task.Run(...);
var tWithoutCapturedCtx = tWithCapturedCtx.ConfigureAwait(false);
await tWithoutCapturedCtx;
}
是否有可能tWithCapturedCtx执行得如此之快以至于将在捕获的上下文上执行继续?
答案 0 :(得分:1)
是否有可能tWithCapturedCtx执行得如此之快以至于将在捕获的上下文上执行延续?
排序。
如果tWithCapturedCtx
在评估await
时已经完成(这意味着tWithoutCapturedCtx
已经完成),那么根本没有延续。 async
方法只是继续同步执行(在相同的上下文中)。
但是,如果tWithCapturedCtx
在评估await
时尚未完成(这意味着tWithoutCapturedCtx
尚未完成),则会在没有上下文的情况下安排继续捕获。
当await
检查其等待是否完成以及await
安排延续时,还有另一个甚至更小的竞争条件。如果等待在该窗口内完成,则继续只是同步运行(同样,在相同的上下文中)。
总之,ConfigureAwait(false)
表示"我不关心此方法的其余部分在&#34 ;;它 not 意味着"在线程池"上运行此方法的其余部分。如果您想说"在线程池线程"上运行此其他代码,请使用Task.Run
。
答案 1 :(得分:0)
ConfigureAwait
被称为。继续被添加到被配置为不捕获上下文的对象,因此它不会在其继续运行时捕获上下文(这实际上是它的存在,它不会如果它没有实现其记录的目的。