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:
// 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");
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:
public static async Task<TResult> InvokeAsync<TResult>(Func<TResult> action) { return await Task.Run(action); }
Wrapper aufrufen:
var task = InvokeAsync(A);
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!