C#에서 비동기 초기화의 단일 실행 보장
이 문서에서는 InitializeAsync()
메서드를 통해 클래스의 비동기 초기화가 여러 스레드의 동시 호출에서도 한 번만 실행되도록 보장하는 과제를 다룹니다.
한 가지 접근 방식은 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>
보다 우아한 솔루션은 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>
참고: DoStuffOnlyOnceAsync()
에는 반환 유형이 없기 때문에 부울 자리 표시자가 사용됩니다.
세련된 AsyncLazy<T>
구현을 보려면 Stephan Cleary의 블로그 게시물을 참조하세요. https://www.php.cn/link/366c0196895c9eeaa75992bacac60426
위 내용은 C#에서 비동기 초기화의 단일 실행을 보장하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!