首页 >后端开发 >C++ >C#中如何保证异步初始化方法单次执行?

C#中如何保证异步初始化方法单次执行?

Linda Hamilton
Linda Hamilton原创
2025-01-13 21:48:42606浏览

How Can I Ensure Single Execution of Asynchronous Initialization Methods in C#?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn