は、非同期プログラミングを簡素化し、コードの読みやすさを向上させます。 ただし、同期のコンテキストを無視すると、デッドロックにつながる可能性があります。この記事では、一般的なデッドロックシナリオを検討し、ソリューションを提供します。
async
await
デッドロックの問題を理解する
非同期プログラミングの頻繁な落とし穴には、Windows UIスレッドやASP.NET要求コンテキストなどの単一スレッドの非レントラント同期コンテキスト内のデッドロックが含まれます。 このコードを検討してください:
デッドロック分析
<code class="language-csharp">public ActionResult ActionAsync() { // DEADLOCK: Blocking on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { // Simple async method var result = await MyWebService.GetDataAsync(); return result.ToString(); }</code>
を開始し、すぐにを使用してブロックし、完了を待ちます。 実行を試行するバックグラウンドタスク。 同期コンテキストは単一スレッドであるため、メインスレッドはコンテキストを保持し、バックグラウンドタスクが継続しないようにします。 デッドロックが発生します。これは、メインスレッドが停止している間にコンテキストスレッドがリリースされるまで
の継続がブロックされるため、が終了するのを待っています。
GetDataAsync()
.Result
ソリューション:デッドロックの防止GetDataAsync()
これらのガイドラインに従って、デッドロックを防止します:GetDataAsync()
GetDataAsync()
戦略的async/awaitの使用法:
同期のコンテキスト認識:
非同期コードが実行される同期コンテキストを理解してください。async
await
結論以上がC#でASYNC/待ち望を使用する場合、どのようにしてデッドロックを回避できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。