How to Ensure Single Execution of Asynchronous Initialization in C#?
Jan 13, 2025 pm 10:03 PMGuaranteeing Single Execution of Asynchronous Initialization in C#
This article addresses the challenge of ensuring a class's asynchronous initialization, via its InitializeAsync()
method, executes only once, even with concurrent calls from multiple threads.
One approach uses SemaphoreSlim
:
public class MyService : IMyService { private readonly SemaphoreSlim mSemaphore = new SemaphoreSlim(1, 1); private bool mIsInitialized; public async Task InitializeAsync() { if (!mIsInitialized) { await mSemaphore.WaitAsync(); if (!mIsInitialized) { await DoStuffOnlyOnceAsync(); mIsInitialized = true; } mSemaphore.Release(); } } private Task DoStuffOnlyOnceAsync() { return Task.Run(() => { Thread.Sleep(10000); }); } }
A more elegant solution leverages AsyncLazy<T>
:
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(); } }
Usage example:
private AsyncLazy<bool> asyncLazy = new AsyncLazy<bool>(async () => { await DoStuffOnlyOnceAsync(); return true; });
Note: A boolean placeholder is used because DoStuffOnlyOnceAsync()
lacks a return type.
For a refined AsyncLazy<T>
implementation, refer to Stephan Cleary's blog post: https://www.php.cn/link/366c0196895c9eeaa75992bacac60426
The above is the detailed content of How to Ensure Single Execution of Asynchronous Initialization in C#?. For more information, please follow other related articles on the PHP Chinese website!

Hot Article

Hot tools Tags

Hot Article

Hot Article Tags

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

What are the types of values returned by c language functions? What determines the return value?

C language function format letter case conversion steps

What are the definitions and calling rules of c language functions and what are the

Where is the return value of the c language function stored in memory?

How do I use algorithms from the STL (sort, find, transform, etc.) efficiently?

How does the C Standard Template Library (STL) work?
