Traditionelle asynchrone „Fire-and-Forget“-Vorgänge in C# unter Verwendung von Delegaten und asynchronen Delegaten führen Aufgaben aus, ohne den Hauptthread zu blockieren. Die Einführung von async
/await
verfeinert diesen Ansatz.
Lassen Sie uns einen Vergleich der älteren und neueren Methoden untersuchen:
<code class="language-csharp">// Old approach Action<string> asyncAction = DoIt; asyncAction.BeginInvoke("Test", ar => { asyncAction.EndInvoke(ar); ar.AsyncWaitHandle.Close(); }, null); Console.WriteLine("Old-style main thread finished"); // New approach DoIt2("Test2"); Console.WriteLine("New-style main thread finished");</code>
Beide erzielen das gleiche Ergebnis, aber async
/await
vereinfacht den Prozess und macht EndInvoke
und manuelles Schließen des Griffs überflüssig. Allerdings kann await Task.Yield();
in bestimmten Szenarien erforderlich sein.
Der Leistungsunterschied zwischen diesen Methoden ist vernachlässigbar. Der Hauptvorteil von async
/await
liegt in seinem verbesserten Ressourcenmanagement; Es führt die Bereinigung automatisch durch und eliminiert so das Risiko von Ressourcenlecks, die mit der manuellen Handle-Verwaltung einhergehen.
Um eine synchrone Methode asynchron auszuführen, A()
, ohne ihren Code zu ändern, wickeln Sie sie in eine asynchrone Methode ein:
<code class="language-csharp">public static async Task<TResult> InvokeAsync<TResult>(Func<TResult> action) { return await Task.Run(action); }</code>
Wrapper aufrufen:
<code class="language-csharp">var task = InvokeAsync(A);</code>
async void
Es empfiehlt sich, async void
Methoden aufgrund ihrer Komplexität bei der Ausnahmebehandlung zu vermeiden. Der Task
-basierte Ansatz oben bietet eine robustere und besser verwaltbare Lösung für den Umgang mit potenziellen Fehlern.
Das obige ist der detaillierte Inhalt vonWie wirkt sich die neue Async/Await-Syntax auf Fire-and-Forget-Vorgänge in C# aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!