Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memastikan Pelaksanaan Tunggal Permulaan Asynchronous dalam C#?

Bagaimana untuk Memastikan Pelaksanaan Tunggal Permulaan Asynchronous dalam C#?

DDD
DDDasal
2025-01-13 22:03:44407semak imbas

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

Menjamin Perlaksanaan Tunggal Permulaan Asynchronous dalam C#

Artikel ini menangani cabaran untuk memastikan pengamulaan tak segerak kelas, melalui kaedah InitializeAsync()nya, dilaksanakan sekali sahaja, walaupun dengan panggilan serentak daripada berbilang urutan.

Satu pendekatan menggunakan 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>

Penyelesaian yang lebih elegan memanfaatkan 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>

Contoh penggunaan:

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

Nota: Pemegang tempat boolean digunakan kerana DoStuffOnlyOnceAsync() tidak mempunyai jenis pemulangan.

Untuk pelaksanaan AsyncLazy<T> yang diperhalusi, rujuk catatan blog Stephan Cleary: https://www.php.cn/link/366c0196895c9eeaa75992bacac60426

Atas ialah kandungan terperinci Bagaimana untuk Memastikan Pelaksanaan Tunggal Permulaan Asynchronous dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn