次のコード サンプルを考えてみましょう。
private void MyMethod() { Task task = MyAsyncMethod(); task.Wait(); } private async Task MyAsyncMethod() { //Code before await await MyOtherAsyncMethod(); //Code after await }
この例では、await キーワードが指定されている場合、 MyAsyncMethod() で検出された場合、制御は MyMethod() に戻ります。ただし、task.Wait()によりスレッドはロックされません。代わりに、継続 (await に続くコード) は別のスレッドで実行されます。
await オペレーターは、継続の実行方法を決定する同期コンテキストを利用します。デフォルトでは、呼び出し元が UI スレッドで実行されている場合、継続も UI スレッドで実行されます。これにより、UI 操作とのシームレスな統合が可能になります。
ただし、呼び出し元がスレッド プール スレッドで実行されている場合、継続は別のスレッド プール スレッドで実行される可能性があります。これは、スレッド プールのスレッドが特定のタスク専用ではなく、複数の操作に同時に使用できるためです。
await オペレーターの動作は、ConfigureAwait メソッドを使用して変更できることに注意することが重要です。このメソッドを使用すると、継続を同じスレッドで実行するか、別のスレッドで実行するかを指定できます。
たとえば、継続を同じスレッドで実行せず、代わりにスレッド プール スレッドで実行する場合は、次のようにします。
await task.ConfigureAwait(false);
同期コンテキストがどのように機能するかを理解することで、非同期コードでのスレッドの実行を効果的に管理し、潜在的なロックの問題を防ぐことができます。
以上がC# で `await` キーワードを使用した後のスレッドの実行はどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。