Sicherer Umgang mit Fire-and-Forget in asynchronen ASP.NET MVC-Methoden
Während der „Fire and Forget“-Ansatz in ASP.NET-Anwendungen im Allgemeinen nicht empfohlen wird, kann es Situationen geben, in denen es notwendig ist, eine asynchrone Methode aufzurufen, ohne auf deren Abschluss zu warten. Allerdings birgt die Ausführung asynchroner Methoden nach dem Fire-and-Forget-Prinzip gewisse Risiken und Einschränkungen.
Ein Risiko besteht darin, dass nicht behandelte Ausnahmen in asynchronen Methoden unbemerkt bleiben und zu unerwartetem Verhalten führen können. Um dieses Problem zu lösen, wird empfohlen, TaskScheduler.UnobservedTaskException
-Ereignisse zu abonnieren, um Ausnahmen zu protokollieren und zu verhindern, dass diese zum Absturz der Anwendung führen.
Eine andere Möglichkeit besteht darin, eine Wrapper-Methode zu erstellen, die die Ausnahme in der asynchronen Methode wie folgt behandelt:
<code class="language-csharp">private async Task DeleteFooWrapperAsync() { try { await DeleteFooAsync(); } catch(Exception exception ) { m_log.Error("DeleteFooAsync failed: " + exception.ToString()); } }</code>
Beachten Sie jedoch, dass das Umschließen jeder asynchronen Methode mit einem Try-Catch-Block ausführlich und repetitiv werden kann.
Ein anderer Ansatz besteht darin, die ASP.NET-Laufzeit zum Registrieren asynchroner Arbeit zu verwenden. Mit der BackgroundTaskManager
-Bibliothek von Scott Hanselman können Sie Aufgaben gleichzeitig ausführen und Ausnahmen zentral protokollieren:
<code class="language-csharp">BackgroundTaskManager.Run(() => DeleteFooAsync());</code>
Diese Methode registriert die Aufgabe bei der Laufzeit, sodass sie nach Abschluss der ASP.NET-Anfrage weiterhin ausgeführt werden kann, während weiterhin Ausnahmen abgefangen werden.
Wenn Sie schließlich eine asynchrone Methode wirklich im Fire-and-Forget-Verfahren ohne Ausnahmebehandlung ausführen müssen, können Sie mit Task.Run()
einen neuen Thread für den asynchronen Vorgang erstellen:
<code class="language-csharp">Task foo = Task.Run( () => DeleteFooAsync() );</code>
Es ist jedoch wichtig zu bedenken, dass Fire-and-Forget nur verwendet werden sollte, wenn Sie die möglichen Folgen nicht behandelter Ausnahmen tolerieren können.
Das obige ist der detaillierte Inhalt vonWie implementiert man asynchrone „Fire and Forget'-Methoden sicher in ASP.NET MVC?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!