Heim >Backend-Entwicklung >C++ >Wie kann die einmalige Ausführung der asynchronen Initialisierung in C# sichergestellt werden?
Gewährleistung der einmaligen Ausführung der asynchronen Initialisierung in C#
In diesem Artikel geht es um die Herausforderung, sicherzustellen, dass die asynchrone Initialisierung einer Klasse über ihre InitializeAsync()
-Methode nur einmal ausgeführt wird, selbst bei gleichzeitigen Aufrufen von mehreren Threads.
Ein Ansatz verwendet SemaphoreSlim
:
<code class="language-csharp">public class MyService : IMyService { private readonly SemaphoreSlim mSemaphore = new SemaphoreSlim(1, 1); private bool mIsInitialized; public async Task InitializeAsync() { if (!mIsInitialized) { await mSemaphore.WaitAsync(); if (!mIsInitialized) { await DoStuffOnlyOnceAsync(); mIsInitialized = true; } mSemaphore.Release(); } } private Task DoStuffOnlyOnceAsync() { return Task.Run(() => { Thread.Sleep(10000); }); } }</code>
Eine elegantere Lösung nutzt AsyncLazy<T>
:
<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>
Anwendungsbeispiel:
<code class="language-csharp">private AsyncLazy<bool> asyncLazy = new AsyncLazy<bool>(async () => { await DoStuffOnlyOnceAsync(); return true; });</code>
Hinweis: Es wird ein boolescher Platzhalter verwendet, da DoStuffOnlyOnceAsync()
kein Rückgabetyp vorhanden ist.
Eine verfeinerte AsyncLazy<T>
Implementierung finden Sie im Blogbeitrag von Stephan Cleary: https://www.php.cn/link/366c0196895c9eeaa75992bacac60426
Das obige ist der detaillierte Inhalt vonWie kann die einmalige Ausführung der asynchronen Initialisierung in C# sichergestellt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!