2016-10-27 112 views
0

這是我寫的一個小測試。爲什麼ConfigureAwait(false)不能與Task.Run/Task.Yield一起使用?

 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

爲什麼不能正常工作?

(注:在另一方面,如果我實際上做ExecutionContext.SuppressFlow();而不是使用ConfigureAwait(false),似乎工作!)

回答

2

ConfigureAwait(false)無關與抑制的執行上下文。它只控制一件事:在await完成之後,是否使用捕獲的SynchronizationContextTaskScheduler來恢復執行。

相關問題