.NET 4.5で新しいHttpClient.GetAsync(...)
/await
言語関数とタスクAPIを使用すると、async
の「待ち望んでいる」結果は、時々スタックされる可能性があります。これは、APIの誤用によって引き起こされます。
async
await
asp.netでは、一度に1つのリクエストを処理できるスレッドは1つだけです。必要に応じて、並列処理を実行できますが、スレッドプールから追加のスレッドを借りる必要があります。これは、asp.net synchronizationcontextによって管理されます。 httpClient.GetAsync(...)
この特定のコントローラーメソッドは、asyncawait_getsomedataasync(ASP.NETリクエストで)を実行します。 asyncawait_getsomedataasyncはhttpclient.getasync(asp.netリクエストで)を実行します。 httpリクエストが送信され、httpclient.getasyncは未完成のタスクを返しました。次に、Asyncawait_getsomedataasyncが未完成のタスクを待っているため、未完成のタスクを返します。次に、test5controller.getは、タスクが完了するまで現在のスレッドをブロックします。
http応答が来ており、httpclient.getasyncによって返されるタスクが完了しました。次に、Asyncawait_getsomedataasyncは、ASP.NETリクエストのコンテキストで回復しようとしました。ただし、コンテキストには既にスレッドがあります。Test5Controller.getでのスレッドブロッキングです。これにより、死んだロックが発生します。
ベストプラクティス この問題を修正するために、私は次のように提案します。
「ライブラリ」の非同期方法で
を使用します。この場合、asyncawait_getsomedataasyncはに変更されますタスクのブロックを避けます。 これらのベストプラクティスに従うことにより、継続(asyncawait_getsomedataasyncメソッドの残りの部分)は、asp.net要求コンテキストで通常のスレッドプールスレッドで実行され、コントローラー自体は非同期です(リクエストスレッドはブロックされません)エッセンス
以上が`httpclient.getasync(...)` asp.netで `await`/` async`を使用するときに時々デッドロックするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。