多くの未処理の非同期操作がいつでも進行している可能性があるという意味で、それは並行です。マルチスレッド化されている場合とされていない場合があります。
デフォルトでawait
は、継続を「現在の実行コンテキスト」に戻すようにスケジュールします。「現在の実行コンテキスト」はSynchronizationContext.Current
、それが非null
であるか、またはTaskScheduler.Current
存在しないかのように定義されSynchronizationContext
ます。
ConfigureAwait
パラメータを呼び出して渡すことfalse
で、このデフォルトの動作をオーバーライドできますcontinueOnCapturedContext
。その場合、継続はその実行コンテキストにスケジュールされません。これは通常、スレッドプール スレッドで実行されることを意味します。
ライブラリ コードを作成している場合を除き、デフォルトの動作はまさに望ましい動作です。WinForms、WPF、および Silverlight (つまり、すべての UI フレームワーク) は を提供するSynchronizationContext
ため、継続は UI スレッドで実行されます (そして、UI オブジェクトに安全にアクセスできます)。ASP.NETSynchronizationContext
は、継続が正しい要求コンテキストで実行されることを保証する も提供します。
他のスレッド (スレッドプール スレッド、Thread
、およびを含むBackgroundWorker
) は、 を提供しませんSynchronizationContext
。そのため、既定ではコンソール アプリと Win32 サービスにはまったくありませんSynchronizationContext
。この場合、継続はスレッドプール スレッドで実行されます。await
これが、 /を使用したコンソール アプリのデモで/async
への呼び出しを含めるか、.Console.ReadLine
ReadKey
Wait
Task
が必要な場合は、私のNito.AsyncExライブラリからSynchronizationContext
使用できます。基本的には、互換性のある「メインループ」と. コンソール アプリと単体テストに便利だと思います(VS2012 には単体テストのサポートが組み込まれています)。AsyncContext
async
SynchronizationContext
async Task
の詳細については、私の 2 月の MSDN 記事SynchronizationContext
を参照してください。
DoEvents
呼び出されることは決してありません。むしろ、制御フローは最後まで戻り、継続 (関数の残り) は後で実行されるようにスケジュールされています。これは、使用された場合のような再入可能性の問題を引き起こさないため、よりクリーンなソリューションですDoEvents
。