0

ここに私が書いた小さなテストがあります。

        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)と、うまくいくようです!)

4

1 に答える 1

3

ConfigureAwait(false)実行コンテキストの抑制とは関係ありません。SynchronizationContextキャプチャされたまたはTaskSchedulerが完了後に実行を再開するために使用されるかどうかという 1 つのことだけを制御awaitします。

于 2016-10-27T19:28:45.860 に答える