非同期 .NET 操作でのデッドロックの防止: Result
プロパティの問題に対処する
.NET の async
および await
キーワードは、非同期プログラミングを大幅に改善します。ただし、Result
の Task
プロパティにアクセスすると、アプリケーションがハングアップしてイライラする可能性があります。 この記事ではその理由と解決策を説明します。
核心的な問題は、タスク ランタイムのデフォルトの動作に起因します。タスク ランタイムは、非同期関数の継続を、それが開始されたのと同じ SynchronizationContext
上でスケジュールします。 たとえば、非同期メソッドが UI スレッドで実行される場合、その継続 (「return result;」) も UI スレッドで実行されます。
Task.Result
が不完全なときに UI スレッドが Task
でブロックされると、デッドロックが発生します。ランタイムはブロックされた UI スレッドで継続を実行しようとし、循環依存関係を作成します。Result
は return ステートメントが実行されるまで取得できませんが、return ステートメントは UI スレッドのブロックが解除されるまで実行できません。
デッドロックを防ぐ戦略:
1.一貫した await
の使用法:
最も簡単な解決策は、コード全体で一貫して await
を使用することです。これにより、すべての操作が Task
の継続内で適切にスケジュールされるようになります。
2. async
修飾子の削除 (該当する場合):
await
の使用が現実的でない場合は、基礎となるコードを直接呼び出す単純なタスクを返すメソッドから async
修飾子を削除します。 「結果を返す」は避けてください。このような場合のパターン
3. ConfigureAwait(false)
を採用しています:
継続スケジュールを明示的に制御するには、ConfigureAwait(false)
を使用します。これにより、現在の SynchronizationContext
に関係なく、継続がスレッド プール スレッドで強制的に実行されます。これにより、ブロックされたスレッドで継続が実行されないようにすることで、デッドロックを防ぎます。
以上が.NET で非同期タスクの `Result` プロパティにアクセスする際のデッドロックを防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。