Heim >Backend-Entwicklung >C++ >Wie kann ich die einmalige Ausführung asynchroner Initialisierungsmethoden in C# sicherstellen?
Einzelausführung asynchroner Initialisierungsmethoden in C#
Bei der C#-Entwicklung ist es wichtig sicherzustellen, dass asynchrone Initialisierungsmethoden nur einmal ausgeführt werden. Dies verhindert Race-Conditions, bei denen mehrere Threads gleichzeitig dieselbe Initialisierung versuchen, was zu möglichen Fehlern führen kann. Während SemaphoreSlim
eine Lösung bietet, bietet AsyncLazy<T>
aus dem Paket Microsoft.Extensions.Primitives
einen eleganteren und effizienteren Ansatz.
AsyncLazy nutzen
AsyncLazy<T>
bietet eine verzögerte Initialisierung für asynchrone Vorgänge. Es kapselt eine asynchrone Aufgabe, sodass Sie mit GetAwaiter()
auf deren Abschluss warten können. Eine leicht modifizierte AsyncLazy<T>
-Klasse ist unten dargestellt:
<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>
Praktische Anwendung
Die Verwendung von AsyncLazy<T>
ist unkompliziert. Instanziieren Sie es mit Ihrer Initialisierungslogik als Lambda-Ausdruck:
<code class="language-csharp">private AsyncLazy<bool> asyncLazy = new AsyncLazy<bool>(async () => { await DoStuffOnlyOnceAsync(); return true; });</code>
Um die Initialisierung auszuführen, warten Sie einfach auf das asyncLazy
-Objekt:
<code class="language-csharp">await asyncLazy;</code>
Zusammenfassung
AsyncLazy<T>
bietet einen sauberen und effizienten Mechanismus zur Sicherstellung der einmaligen Ausführung asynchroner Initialisierungsmethoden. Es vereinfacht die Entwicklung, indem es die Komplexität der manuellen Sperrung oder Semaphorverwaltung eliminiert, was zu besser lesbarem und wartbarem Code führt.
Das obige ist der detaillierte Inhalt vonWie kann ich die einmalige Ausführung asynchroner Initialisierungsmethoden in C# sicherstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!