C# 中非同步初始化方法的單次執行
在 C# 開發中,確保非同步初始化方法僅執行一次至關重要。這可以防止多個執行緒同時嘗試相同初始化的競爭情況,從而導致潛在的錯誤。 雖然 SemaphoreSlim
提供了一種解決方案,但 AsyncLazy<T>
包中的 Microsoft.Extensions.Primitives
提供了一種更優雅、更有效率的方法。
利用 AsyncLazy
AsyncLazy<T>
為非同步操作提供延遲初始化。 它封裝了一個非同步任務,允許您使用 GetAwaiter()
等待其完成。 稍作修改的 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>
實際應用
使用 AsyncLazy<T>
很簡單。 使用初始化邏輯將其實例化為 lambda 表達式:
<code class="language-csharp">private AsyncLazy<bool> asyncLazy = new AsyncLazy<bool>(async () => { await DoStuffOnlyOnceAsync(); return true; });</code>
要執行初始化,只要等待 asyncLazy
物件:
<code class="language-csharp">await asyncLazy;</code>
總結
AsyncLazy<T>
提供了一個乾淨且有效率的機制來確保非同步初始化方法的單次執行。 它透過消除手動鎖定或信號量管理的複雜性來簡化開發,從而產生更具可讀性和可維護性的程式碼。
以上是C#中如何保證非同步初始化方法單次執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!