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

Why doesn't ConfigureAwait(false) work with Task.Run/Task.Yield?

这是我写的一个小测试。

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

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

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

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

堆栈:

  1. d.MoveNext
  2. MoveNextRunner.InvokeMoveNext
  3. ExecutionContext.Run内部
  4. ExecutionContext.Run

为什么这不起作用?

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

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