ホームページ > バックエンド開発 > C++ > C# 's `async`/` await」で非同期のデッドロックがどのように発生するのでしょうか?

C# 's `async`/` await」で非同期のデッドロックがどのように発生するのでしょうか?

Susan Sarandon
リリース: 2025-02-02 01:36:14
オリジナル
542 人が閲覧しました

How Can Asynchronous Deadlocks Occur in C#'s `async`/`await` and How Can They Be Avoided?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート