ホームページ >バックエンド開発 >C++ >ASP.NET での未処理の操作の処理において、Async Void メソッドと Async Task メソッドはどのように異なりますか?

ASP.NET での未処理の操作の処理において、Async Void メソッドと Async Task メソッドはどのように異なりますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-04 01:43:41843ブラウズ

How Do Async Void and Async Task Methods Differ in Handling Outstanding Operations in ASP.NET?

ASP.Net の Async Void および Async Task の未処理の操作の数

ASP.Net アプリケーションでは、async void メソッドは未処理の操作の処理における非同期タスク メソッド。この区別により、async void では次の例外が発生する可能性がありますが、async Task では発生しません。

System.InvalidOperationException: An asynchronous module or handler completed while an asynchronous operation was still pending

Async Void について

Async void は、次の場合に未処理の操作の数を増やします。が呼び出され、完了するとデクリメントされます。これは、ASP.Net がタスクの完了を追跡するため、実際には「起動して忘れる」動作にはならないことを意味します。

非同期タスクはなぜ機能するのですか?

場合タスクを返しても、未処理の操作の数は増加しません。代わりに、フレームワークは、返されたタスクが完了するまで非同期で待機します。このアプローチにより、上記の例外が発生する可能性が排除されます。

public class HomeController : AsyncController
{
    // Will work fine (no exception)
    public async Task<ActionResult> ThisPageWillLoad()
    {
        // Fire and forget task
        this.FireAndForgetTask();

        return await Task.FromResult(this.View("Index"));
    }

    private async Task FireAndForgetTask()
    {
        var task = Task.Delay(TimeSpan.FromSeconds(3));
        await task;
    }

    // Will result in an exception due to async void
    public async Task<ActionResult> ThisPageWillNotLoad()
    {
        this.FireAndForgetVoid();

        return await Task.FromResult(this.View("Index"));
    }

    private async void FireAndForgetVoid()
    {
        var task = Task.Delay(TimeSpan.FromSeconds(3));
        await task;
    }
}

歴史的コンテキスト

Microsoft の優先順位は後方にありますASP.Net に非同期を導入する場合の互換性と「1 つの ASP.NET」。 EAP コンポーネントのサポートは維持されましたが、コア ASP.Net SynchronizationContext が強化され、特定のシナリオでの async void の不適切な使用を検出して除外できるようになりました。 MVC/WebAPI/SignalR の世界では、フレームワークは自然に async Task を採用し、async void の必要性を排除しました。

結論

現代の ASP.Net アプリケーションでは、一般に、 async void を避け、代わりに Task を返すことをお勧めします。このアプローチにより、未処理の操作が適切に追跡され、前述の例外が発生する可能性が排除されます。

以上がASP.NET での未処理の操作の処理において、Async Void メソッドと Async Task メソッドはどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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