await キーワード後のスレッドの動作を理解する
非同期プログラミングでは、await キーワードはスレッドを管理し、効率的な実行を確保する上で重要な役割を果たします。ただし、await が発生した後にコードがどのように処理されるかを理解するのは混乱する可能性があります。この記事は、詳細な調査によってこれを明確にすることを目的としています。
例として次のコード スニペットを考えてみましょう。
private async Task MyAsyncMethod() { // Code before await await MyOtherAsyncMethod(); // Code after await } private void MyMethod() { Task task = MyAsyncMethod(); task.Wait(); }
MyAsyncMethod で await キーワードが検出されると、制御は MyMethod に返されます。これは、MyAsyncMethod が非同期としてマークされているためです。ただし、その後 task.Wait() が呼び出されるため、MyMethod を実行しているスレッドがブロックされ、await 後のコードの実行が妨げられているように見えます。
Does a New Thread Execute the Code After await? >
答えは「おそらく」です。この動作は、await 式が評価される時点で「最新」である同期コンテキストの実装によって異なります。
提供された例では、コードが UI スレッドで実行されている場合、継続 (コードawait 後) は同じ UI スレッドで実行されます。一方、コードがスレッド プール スレッドで実行されている場合、継続は利用可能なスレッド プール スレッドで実行できます。
スレッド ブロックの回避
await の直後にコードを実行することが目的の場合、task.Wait() または task.Result によるスレッドのブロックを避けることが重要です。代わりに、コールバックの登録や待機タスク自体の使用など、他のオプションを検討してください。
スレッド アフィニティの制御
継続に特定のスレッド アフィニティが必要なシナリオの場合、 ConfigureAwaitメソッドが利用可能です。 ConfigureAwait に false を渡すと、継続を別のスレッド コンテキストで実行するように明示的に指示できます。
追加リソース
await によるスレッドの動作についての理解を深めるには、次のようにします。次のリソースを参照してください:
以上がC# 非同期プログラミングで `await` キーワードを使用した後、スレッドはどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。