ConfigureAwait
でちょっと試しています。私はそれがどのように機能するのか理解したいからです。ConfigureAwaitは非スレッドプールスレッドにのみ影響しますか?
void Main()
{
// Use dispatcher to execute the code on STA thread
Dispatcher.CurrentDispatcher.Invoke(() => Run());
}
private async static Task Run()
{
var continueOnCapturedContext1 = true;
var continueOnCapturedContext2 = true;
PrintThreadID();
await Task.Run(() => PrintThreadID()).ConfigureAwait(continueOnCapturedContext1);
PrintThreadID();
await Task.Run(() => PrintThreadID()).ConfigureAwait(continueOnCapturedContext2);
PrintThreadID();
}
private static void PrintThreadID()
{
Console.Write(Thread.CurrentThread.ManagedThreadId.ToString("00") + "\t");
}
そして、私は次の出力ました:
Therfore、私は(実際にはLINQPadで実行されている)以下の小さなコンソールアプリケーションを書いた
A)の真/真
var continueOnCapturedContext1 = true;
var continueOnCapturedContext2 = true;
1)11 19 11 07 11
予想2)11 09 11 12 11
3)11 06 11 06 11
:ディスパッチャスレッド(11)を捕捉したとawaitableタスクは、異なるまたは同一のスレッドプールのスレッドで実行されました。 FALSE FALSE
B)/
var continueOnCapturedContext1 = false;
var continueOnCapturedContext2 = false;
1)11 23 23 22 22
2)11 19 19 19 19
3)11 10 10 10 10
また、SynchronizationContextはcaそれに続く待ち受け可能で非待ち受けのコードがスレッドプールスレッド(通常は同じ)上で実行されました。
C)真/偽
var continueOnCapturedContext1 = false;
var continueOnCapturedContext2 = true;
1)
2)11 20 20 20 20
3)
出力1と出力3の結果が奇妙です。 2. awaitbaleタスクは、キャプチャされたコンテキストで続行するオプションで実行されたので、呼び出されたコードと同じスレッドで実行されることが期待されます。
ConfigureAwait(true/false)は、以前に呼び出されたことがある次の待ち受け可能な呼び出しには影響しないようです。
synccontextは、好きなことを行うことができます。それは、コインの裏返しにもかかわらず、あなたのコードをどんなスレッドでも実行することができます。したがって、*よく使われるコンテキストが何をするのかを理解することは重要です。 ConfigureAwait(false)は単に「存在する場合でもコンテキストを使用しない」と言うだけです。 – usr