Verwalten asynchroner Fire-and-Forget-Vorgänge in ASP.NET MVC-Controllern
Asynchrone „Fire-and-Forget“-Methoden wie DeleteFooAsync
kommen in der asynchronen Programmierung häufig vor. Während der herkömmliche Rat darin besteht, async
/await
in diesen Szenarien zu vermeiden, kann dies unpraktisch sein, wenn kein synchrones Gegenstück verfügbar ist.
Die einfache Behandlung unbeobachteter Ausnahmen mit TaskScheduler.UnobservedTaskException
ist unzuverlässig, da es zu Problemen mit dem Synchronisierungskontext kommen kann.
Das Einschließen der asynchronen Methode in einen Try-Catch-Block, wie unten gezeigt, behebt Ausnahmen, erweist sich jedoch für zahlreiche Methoden als umständlich:
<code class="language-csharp">private async void DeleteFooWrapperAsync() { try { await DeleteFooAsync(); } catch (Exception exception) { m_log.Error("DeleteFooAsync failed: " + exception.ToString()); } }</code>
Die robusteste Lösung für Fire-and-Forget-Aufrufe innerhalb eines ASP.NET MVC-Controllers ist die Verwendung von Task.Run
:
<code class="language-csharp">Task foo = Task.Run(() => DeleteFooAsync());</code>
Dadurch wird der asynchrone Vorgang auf einen separaten Thread verlagert, wodurch verhindert wird, dass er die Antwort blockiert, und eine zuverlässige Ausführung gewährleistet wird.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit Fire-and-Forget-Async-Methoden in ASP.NET MVC richtig um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!