Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memastikan Pelaksanaan Tunggal Permulaan Asynchronous dalam 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!