Invocation unique de méthodes asynchrones : une approche robuste
En programmation asynchrone, empêcher plusieurs invocations d'une méthode est crucial, notamment lors de l'initialisation. Une exécution en double ou simultanée peut entraîner des incohérences de données et des erreurs d'application. Bien que SemaphoreSlim
offre une solution, une approche plus rationalisée utilise AsyncLazy<T>
.
AsyncLazy<T>
fournit une valeur évaluée paresseusement et calculée de manière asynchrone. En initialisant un AsyncLazy<bool>
avec votre opération asynchrone, vous garantissez une exécution unique.
Voici une AsyncLazy<T>
implémentation raffinée optimisée à cet effet :
<code class="language-csharp">public class AsyncLazy<T> : Lazy<Task<T>> { public AsyncLazy(Func<T> valueFactory) : base(() => Task.Run(valueFactory)) { } public AsyncLazy(Func<Task<T>> taskFactory) : base(() => Task.Run(() => taskFactory())) { } public TaskAwaiter<T> GetAwaiter() { return Value.GetAwaiter(); } }</code>
L'utilisation est simple :
<code class="language-csharp">private AsyncLazy<bool> asyncLazy = new AsyncLazy<bool>(async () => { await DoStuffOnlyOnceAsync(); return true; });</code>
Remarque : Le type de retour bool
est un espace réservé ; La valeur de retour de DoStuffOnlyOnceAsync
n'est pas utilisée ici.
Cette AsyncLazy<T>
implémentation offre un moyen propre et efficace de garantir un appel de méthode asynchrone unique, en maintenant l'intégrité des données de l'application pendant l'initialisation.
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!