ホームページ >バックエンド開発 >C++ >Async/待ち時間がC#でどのように発生するか、どのようにしてそれらを防ぐことができますか?

Async/待ち時間がC#でどのように発生するか、どのようにしてそれらを防ぐことができますか?

Susan Sarandon
Susan Sarandonオリジナル
2025-02-02 01:31:15650ブラウズ

How Can Async/Await Deadlocks Occur in C#, and How Can They Be Prevented?

C# 'のAsync/await

のデッドロックを理解し、防止します

c# 'sasync/awaitは非同期プログラミングを簡素化しますが、不適切な使用はデッドロックにつながる可能性があります。 一般的なシナリオを調べてみましょう:

<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>

デッドロック:

メインスレッドで実行されているActionAsyncが同期してGetDataAsyncを使用して完了するのを同期的に待つため、デッドロックが発生します。 通常、.Resultはスレッドをリリースしますが、awaitは同期待機を強制します。 重要なことに、.Resultはメインスレッドのコンテキスト内で実行されます。 GetDataAsyncsawaitの場合、コンテキストをキャプチャし、再開するのを待ちます。 しかし、メインスレッドはブロックされており、MyWebService.GetDataAsyncが終了しないようにします。 これは古典的なデッドロックです。メインスレッドはGetDataAsyncを待ちます。これは、メインスレッドがコンテキストをリリースするのを待ちます。 GetDataAsync

デッドロック予防:

ソリューションは、

/

を使用するときにスレッドを同期的にブロックすることを避けることです。 適切な継続を確実にするために、常にasyncメソッド内でawaitを使用してください。これにより、コンテキストスレッドのブロックを防ぎ、非同期操作が完了することができます。 修正されたコードは次のようになります:await async by

ing
<code class="language-csharp">public async Task<ActionResult> ActionAsync()
{
    // Correct: Awaiting the async task
    var data = await GetDataAsync();

    return View(data);
}

private async Task<string> GetDataAsync()
{
    // ... (remains unchanged) ...
}</code>
in

では、メインスレッドが非同期に実行されている間に他のタスクの処理を続けることを許可します。 これにより、デッドロックが排除されます。 メソッドは非同期操作として扱われ、awaitGetDataAsyncを使用してそれに応じて処理する必要があります

以上がAsync/待ち時間がC#でどのように発生するか、どのようにしてそれらを防ぐことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。