为什么 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 是调用者:
堆栈:
d.MoveNext
- MoveNextRunner.InvokeMoveNext
- ExecutionContext.Run内部
- ExecutionContext.Run
为什么这不起作用?
(注意:另一方面,如果我实际上使用 ExecutionContext.SuppressFlow();
而不是使用 ConfigureAwait(false)
,它似乎有效!)
ConfigureAwait(false)
与抑制执行上下文无关。它只控制一件事:捕获的 SynchronizationContext
或 TaskScheduler
是否用于在 await
完成后恢复执行。
这是我写的一个小测试。
Assert.False(ExecutionContext.IsFlowSuppressed()); // Precondition
await Task.Run(() => Task.Yield()).ConfigureAwait(false);
var isSuppressed = Utility.WasExecutionContextActuallySuppressed();
Assert.True(isSuppressed);
但是,遍历堆栈的代码 'WasExecutionContextActuallySuppressed,returns false - 表示上下文未被抑制 - 因为堆栈显示 ExecutionContext.Run 是调用者:
堆栈:
d.MoveNext - MoveNextRunner.InvokeMoveNext
- ExecutionContext.Run内部
- ExecutionContext.Run
为什么这不起作用?
(注意:另一方面,如果我实际上使用 ExecutionContext.SuppressFlow();
而不是使用 ConfigureAwait(false)
,它似乎有效!)
ConfigureAwait(false)
与抑制执行上下文无关。它只控制一件事:捕获的 SynchronizationContext
或 TaskScheduler
是否用于在 await
完成后恢复执行。