Task :: ConfigureAwait - 竞争条件?

时间:2016-03-15 16:55:21

标签: c# task-parallel-library race-condition

想象一下调用者创建任务时的情境:

{
 var tWithCapturedCtx = Task.Run(...);
 var tWithoutCapturedCtx = tWithCapturedCtx.ConfigureAwait(false);

 await tWithoutCapturedCtx;
}

是否有可能tWithCapturedCtx执行得如此之快以至于将在捕获的上下文上执行继续?

2 个答案:

答案 0 :(得分:1)

  

是否有可能tWithCapturedCtx执行得如此之快以至于将在捕获的上下文上执行延续?

排序。

如果tWithCapturedCtx在评估await时已经完成(这意味着tWithoutCapturedCtx已经完成),那么根本没有延续。 async方法只是继续同步执行(在相同的上下文中)。

但是,如果tWithCapturedCtx在评估await时尚未完成(这意味着tWithoutCapturedCtx尚未完成),则会在没有上下文的情况下安排继续捕获。

await检查其等待是否完成以及await安排延续时,还有另一个甚至更小的竞争条件。如果等待在该窗口内完成,则继续只是同步运行(同样,在相同的上下文中)。

总之,ConfigureAwait(false)表示"我不关心此方法的其余部分在&#34 ;;它 not 意味着"在线程池"上运行此方法的其余部分。如果您想说"在线程池线程"上运行此其他代码,请使用Task.Run

答案 1 :(得分:0)

在继续添加到任务之前,

ConfigureAwait被称为。继续被添加到被配置为不捕获上下文的对象,因此它不会在其继续运行时捕获上下文(这实际上是它的存在,它不会如果它没有实现其记录的目的。