task.wait vs. await:非同期.NETプログラミングのデッドロックの危険
.NETで非同期操作を操作する場合、とTask.Wait
の違いを理解することが最重要です。 一見似ていますが、不適切な使用はデッドロックにつながる可能性があります
await
サンプルコードには、ASP.NET Web APIから呼び出された3つの非同期メソッド(
、、Foo
)が表示されます。 問題は、10個のタスクを同時に待つためにBar
を使用している場合に発生します。これはデッドロックにつながります。Ros
Task.WaitAll
Ros
Task.Wait
await
待望のタスクが終了するまで、現在のスレッドを同期してブロックします。 逆に、
なぜデッドロックが発生するのかTask.Wait
await
タスク(ループ内)が実行されないために発生します。これらのタスクは、以前の非同期メソッド(、)に依存しており、それ自体が他のタスクを待っています。 メインスレッドがブロックされていると、これらの依存タスクが完了することができず、デッドロックを引き起こします。
ブロッキングの回避:好ましいアプローチTask.WaitAll
Ros
Ros
一見魅力的になりながら、これを解決するために協力的なブロッキングを使用することは一般に落胆します。 予測不可能性を導入し、アプリケーションの動作分析を複雑にします。 最良の解決策は、タスクが非同期に完了し、それによってデッドロックを避けることです。
以上がASP.NET Web APIの非同期操作でTask.Waitallがデッドロックを引き起こすにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。