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中文网其他相关文章!