c#:aの同期コンテキストの問題
のasyncデッドロックc# 'sasync
/await
は非同期プログラミングを簡素化しますが、同期コンテキストの不適切な取り扱いは、デッドロックにつながる可能性があります。 同期コンテキストは、正しいスレッドでコードが実行されることを保証しますが、UIスレッドやASP.NET要求コンテキストなどの非レントラントまたは単一スレッドのコンテキストで問題が発生します。
このシナリオを検討してください:
ここで、
<code class="language-csharp">public ActionResult ActionAsync() { var data = GetDataAsync().Result; // Blocking call! return View(data); } private async Task<string> GetDataAsync() { var result = await MyWebService.GetDataAsync(); return result.ToString(); }</code>
それ自体が背景タスクを待っています。 これにより、デッドロックが作成されます。メインスレッド(ActionAsync
)がブロックされ、バックグラウンドタスクが完了するのを防ぎ、GetDataAsync
が終了するのを防ぎ、永続的なデッドロックになります。
GetDataAsync
デッドロックは、メインスレッドの同期コンテキストがActionAsync
inGetDataAsync
の間にキャプチャされ、メインスレッドの完了に依存するために発生します。 メインスレッドがブロックされているため、この依存関係は
単一の読み取りコンテキストのソリューションは、await
メソッド内で操作をブロックすることを避けることです。 同期のためにポーリングやコールバックなどの非ブロッキング手法を使用します。 GetDataAsync
の代わりに、この特定の例を解決するには、GetDataAsync
内で
以上がC# 's `async`/` await」で非同期のデッドロックがどのように発生するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。