確保 C# 中非同步初始化的單次執行
在非同步程式設計中,必須確保初始化過程僅運行一次。 想像一個類別需要透過 InitializeAsync()
方法進行非同步初始化。 防止多個執行緒同時呼叫此方法是關鍵。雖然可以使用 SemaphoreSlim
,但有更有效率、更優雅的方法。
AsyncLazy:簡化的解
AsyncLazy
是標準 .NET Lazy
類別的擴展,專為非同步初始化而設計。它提供了一個簡單而有效的解決方案。
<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>
使用 AsyncLazy
很簡單。實例化它,提供非同步初始化邏輯:
<code class="language-csharp">private AsyncLazy<bool> asyncLazy = new AsyncLazy<bool>(async () => { await DoStuffOnlyOnceAsync(); return true; });</code>
總結
AsyncLazy
提供了一種健全且使用者友好的方法來確保非同步初始化的單次執行。它的簡單性使其成為防止並發呼叫關鍵初始化函數的理想選擇。
以上是C#非同步初始化如何保證單次執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!