Les opérations asynchrones traditionnelles C# "fire-and-forget", utilisant des délégués et des délégués asynchrones, exécutent des tâches sans bloquer le thread principal. L'introduction de async
/await
affine cette approche.
Examinons une comparaison des méthodes plus anciennes et plus récentes :
<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>
Les deux obtiennent le même résultat, mais async
/await
simplifie le processus, éliminant le besoin de EndInvoke
et de fermeture manuelle par poignée. Cependant, await Task.Yield();
pourrait être nécessaire dans certains scénarios.
La différence de performances entre ces méthodes est négligeable. Le principal avantage de async
/await
réside dans sa gestion améliorée des ressources ; il gère automatiquement le nettoyage, éliminant ainsi le risque de fuite de ressources associé à la gestion manuelle des poignées.
Pour exécuter de manière asynchrone une méthode synchrone, A()
, sans altérer son code, enveloppez-la dans une méthode asynchrone :
<code class="language-csharp">public static async Task<TResult> InvokeAsync<TResult>(Func<TResult> action) { return await Task.Run(action); }</code>
Appelez le wrapper :
<code class="language-csharp">var task = InvokeAsync(A);</code>
async void
Il est préférable d'éviter les async void
méthodes en raison de leur complexité dans la gestion des exceptions. L'approche basée sur Task
ci-dessus fournit une solution plus robuste et plus gérable pour gérer les erreurs potentielles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!