Heim > Backend-Entwicklung > C++ > Wie unterscheiden sich die Methoden „Async Void' und „Async Task' bei der Behandlung ausstehender Vorgänge in ASP.NET?

Wie unterscheiden sich die Methoden „Async Void' und „Async Task' bei der Behandlung ausstehender Vorgänge in ASP.NET?

Mary-Kate Olsen
Freigeben: 2025-01-04 01:43:41
Original
824 Leute haben es durchsucht

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

Anzahl ausstehender Vorgänge in Async Void und Async Task in ASP.Net

In ASP.Net-Anwendungen unterscheidet sich eine asynchrone Void-Methode von eine asynchrone Task-Methode bei der Verarbeitung ausstehender Vorgänge. Diese Unterscheidung kann bei async void zu der folgenden Ausnahme führen, nicht jedoch bei async Task:

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

Async void verstehen

Async void erhöht die Anzahl ausstehender Vorgänge, wenn aufgerufen und dekrementiert es, wenn es fertig ist. Dies bedeutet, dass es nicht wirklich zu einem „Fire and Forget“-Verhalten führt, da ASP.Net seinen Abschluss verfolgt.

Warum funktioniert Async Task?

Wann Wenn Sie eine Aufgabe zurückgeben, erhöht sich die Anzahl der ausstehenden Vorgänge nicht. Stattdessen verarbeitet das Framework das asynchrone Warten auf den Abschluss der zurückgegebenen Aufgabe. Dieser Ansatz eliminiert das Potenzial für die oben genannte Ausnahme.

Beispiel

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;
    }
}
Nach dem Login kopieren

Historischer Kontext

Microsoft hat rückwärts priorisiert Kompatibilität und „ein ASP.NET“ bei der Einführung von Async in ASP.Net. Sie behielten die Unterstützung für EAP-Komponenten bei, verbesserten jedoch den Kern-ASP.Net-Synchronisationskontext, um in bestimmten Szenarien jede unsachgemäße Verwendung von async void zu erkennen und auszuschließen. In der MVC/WebAPI/SignalR-Welt haben Frameworks asynchrone Aufgaben auf natürliche Weise übernommen, wodurch die Notwendigkeit einer asynchronen Lücke entfällt.

Fazit

In modernen ASP.Net-Anwendungen ist dies im Allgemeinen der Fall Es wird empfohlen, stattdessen eine asynchrone Void- und Return-Aufgabe zu vermeiden. Dieser Ansatz gewährleistet eine ordnungsgemäße Verfolgung ausstehender Vorgänge und eliminiert die Möglichkeit der oben genannten Ausnahme.

Das obige ist der detaillierte Inhalt vonWie unterscheiden sich die Methoden „Async Void' und „Async Task' bei der Behandlung ausstehender Vorgänge in ASP.NET?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage