Heim >Backend-Entwicklung >C++ >Wie unterscheiden sich die Methoden „Async Void' und „Async Task' bei der Behandlung ausstehender Vorgänge 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
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; } }
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!