マルチスレッド アプリケーションでは、実行の流れを理解することが重要です。謎めいた 'await' キーワードに遭遇したとき、開発者はよく次のような質問に取り組みます: 「'await' の後のコードの再開を調整するのはどのスレッドですか?」
次のコード スニペットを検討してください:
private void MyMethod() { Task task = MyAsyncMethod(); task.Wait(); } private async Task MyAsyncMethod() { //Code before await await MyOtherAsyncMethod(); //Code after await }
このコードがシングルスレッドアプリケーション内で動作すると仮定すると、複雑になります: 'await' キーワードの後のコードはどうすればよいでしょうかスレッドが 'task.Wait()' によってロックされている場合に実行しますか?
その答えは、'await' キーワードの洗練された動作にあります。呼び出し元に制御を返し、他の非同期操作を続行できるようにします。 'awaiting' タスクの継続 ('await' の後のコード) は、現在の同期コンテキストに準拠するスレッドで実行されるようにスケジュールされています。
このシナリオでは、'MyMethod()' 関数がUI スレッドで実行されている場合、「MyOtherAsyncMethod()」の後に「await」の後のコードも UI スレッドで実行されます。
ただし、継続に使用される正確なスレッドが保証されていないことに注意することが重要です。マルチスレッド アプリケーションでは、継続はスレッド プール内の使用可能なスレッドで実行できます。ただし、同期コンテキストは、'await' の後のコードが元のスレッドに対して一貫した方法で実行されることを保証します。
指定された例では、'task.Wait()' を呼び出すことで、メインスレッドは無期限にブロックされ、継続が実行されなくなります。これを回避するには、メインスレッドをブロックせずに、非同期操作を適切に待機する必要があります。
以上がマルチスレッドアプリケーションで「await」キーワードの後にコードを実行するスレッドはどれですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。