异步方法的单次调用:一种稳健的方法
在异步编程中,防止多次调用一个方法至关重要,特别是在初始化期间。 重复或并发执行可能会导致数据不一致和应用程序错误。 虽然 SemaphoreSlim
提供了一种解决方案,但更简化的方法是使用 AsyncLazy<T>
。
AsyncLazy<T>
提供延迟计算、异步计算的值。 通过使用异步操作初始化 AsyncLazy<bool>
,可以保证单次执行。
这是为此目的优化的改进的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>
使用很简单:
<code class="language-csharp">private AsyncLazy<bool> asyncLazy = new AsyncLazy<bool>(async () => { await DoStuffOnlyOnceAsync(); return true; });</code>
注意:bool
返回类型是占位符; 这里没有使用DoStuffOnlyOnceAsync
的返回值。
这个AsyncLazy<T>
实现提供了一种干净而有效的方法来确保单个异步方法调用,在初始化期间保持应用程序数据的完整性。
以上是如何保证异步方法的单次调用?的详细内容。更多信息请关注PHP中文网其他相关文章!