Heim >Backend-Entwicklung >C++ >Wie kann die einmalige Ausführung der asynchronen Initialisierung in C# sichergestellt werden?

Wie kann die einmalige Ausführung der asynchronen Initialisierung in C# sichergestellt werden?

DDD
DDDOriginal
2025-01-13 22:03:44407Durchsuche

How to Ensure Single Execution of Asynchronous Initialization in C#?

Gewährleistung der einmaligen Ausführung der asynchronen Initialisierung in C#

In diesem Artikel geht es um die Herausforderung, sicherzustellen, dass die asynchrone Initialisierung einer Klasse über ihre InitializeAsync()-Methode nur einmal ausgeführt wird, selbst bei gleichzeitigen Aufrufen von mehreren Threads.

Ein Ansatz verwendet SemaphoreSlim:

<code class="language-csharp">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);
        });
    }
}</code>

Eine elegantere Lösung nutzt 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>

Anwendungsbeispiel:

<code class="language-csharp">private AsyncLazy<bool> asyncLazy = new AsyncLazy<bool>(async () =>
{
    await DoStuffOnlyOnceAsync();
    return true;
});</code>

Hinweis: Es wird ein boolescher Platzhalter verwendet, da DoStuffOnlyOnceAsync() kein Rückgabetyp vorhanden ist.

Eine verfeinerte AsyncLazy<T> Implementierung finden Sie im Blogbeitrag von Stephan Cleary: https://www.php.cn/link/366c0196895c9eeaa75992bacac60426

Das obige ist der detaillierte Inhalt vonWie kann die einmalige Ausführung der asynchronen Initialisierung in C# sichergestellt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn