为什么ConfigureAwait(false)不能与Task.Run/Task.Yield一起使用?

时间:2016-10-27 18:15:54

标签: .net executioncontext

这是我写的一个小测试。

        Assert.False(ExecutionContext.IsFlowSuppressed()); // Precondition

        await Task.Run(() => Task.Yield()).ConfigureAwait(false);

        var isSuppressed = Utility.WasExecutionContextActuallySuppressed();
        Assert.True(isSuppressed);

然而,代码' WasExecutionContextActuallySuppressed遍历堆栈,返回false - 表示上下文未被抑制 - 因为堆栈显示ExecutionContext.Run是调用者:

堆栈:

  1. < b__6_0> d.MoveNext
  2. MoveNextRunner.InvokeMoveNext
  3. ExecutionContext.RunInternal
  4. ExecutionContext.Run
  5. 为什么这不起作用?

    (注意:另一方面,如果我实际上ExecutionContext.SuppressFlow();而不是使用ConfigureAwait(false),它似乎有效!)

1 个答案:

答案 0 :(得分:2)

ConfigureAwait(false)与抑制执行上下文无关。它只控制一件事:在SynchronizationContext完成后,捕获的TaskSchedulerawait是否用于恢复执行。