デッドロックは一般的な問題です。 これは、同期のコンテキストが非同期操作とどのように相互作用するかのために発生します。
async
await
デッドロックのルート
例えば非同期方法が同期と呼ばれ、その結果が
を使用して結果が待っているときにデッドロックが発生します。 これにより、単一のスレッドがブロックされます。の継続には、同じスレッド(キャプチャされた同期コンテキスト)が必要なため、実行できず、デッドロックを作成します。
GetDataAsync
.Result
ソリューション:非ブロッキングアプローチGetDataAsync
これを避けるための鍵は、単一のスレッドのブロックを避けることです。 非同期操作が完了するのを同期的に待つ代わりに、非ブロッキングアプローチを使用してください:
ここで、完了が一度実行される継続をスケジュールします。これにより、メインスレッドが解放され、非同期操作が終了すると同じスレッドで継続が実行されます。 これにより、デッドロックが防止されます。 特定のフレームワークと目的の動作に応じて、
を調整する必要がある場合があることに注意してください。 より適切なリターンは、コンテキストに応じて、<code class="language-csharp">public ActionResult ActionAsync() { // NON-BLOCKING ASYNC OPERATION GetDataAsync().ContinueWith(task => { var data = task.Result; // Access result safely here return View(data); }); return View();//or some other non-blocking return }</code>
以上が単一の読み取りコンテキストでは、どのようにしてデッドロックを待ち望んでいますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。