2016-10-27 1 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 который идет стек, возвращает ложь - указывает на контекст не был подавлен - поскольку стек показывает ExecutionContext.Run является абонент:

Stack:

  1. < b__6_0> d.MoveNext
  2. MoveNextRunner.InvokeMoveNext
  3. ExecutionContext.RunInternal
  4. ExecutionContext.Run

Почему это не работает?

(Примечание: с другой стороны, если я на самом деле сделать ExecutionContext.SuppressFlow(); вместо использования ConfigureAwait(false), кажется, работает!)

ответ

2

ConfigureAwait(false) не имеет ничего общего с подавлением контекста выполнения. Он контролирует только одно: захватывает ли SynchronizationContext или TaskScheduler, чтобы возобновить выполнение после завершения await.

Смежные вопросы