본문 바로가기
프로그래밍/C#

비동기에서[async/await] lock 사용하기

by 뽀도 2024. 7. 11.

SemaphoreSlim 클래스를 사용하면 비동기에서 lock을 사용할 수 있다.

 

 

AsyncLock.cs 

namespace Common;

public sealed class AsyncLock
{
    // 한번에 하나의 스레드만 접근 가능하도록 설정되어, 사실상 뮤텍스처럼 동작한다. 
    private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);

    // 동시 실행 제한 수 3
    //private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(3); 

    public async Task<IDisposable> LockAsync()
    {
        await _semaphore.WaitAsync();
        return new Handler(_semaphore);
    }

    private sealed class Handler : IDisposable
    {
        private readonly SemaphoreSlim _semaphore;
        private bool _disposed = false;

        public Handler(SemaphoreSlim semaphore)
        {
            _semaphore = semaphore;
        }

        public void Dispose()
        {
            if (_disposed == false)
            {
                _semaphore.Release();
                _disposed = true;
            }
        }
    }
}

 

 

사용 방법 ↓

private readonly AsyncLock _AsyncLock = new AsyncLock();

public async Task TestAsyncLock()
{
    using (await _AsyncLock.LockAsync())
    {
        await 뭔가 작업 
    }
}

 

IDisposable을 상속받는 Handler 클래스로 처리하기 때문에 별도의 관리가 필요 없다.

 

 

 

참고)

https://jacking75.github.io/csharp_asyncawait_lock/

반응형

'프로그래밍 > C#' 카테고리의 다른 글

[C#] Global Using  (0) 2024.08.05
오버헤드  (0) 2024.07.31
[.net] nullable reference types 관련 경고 처리  (0) 2024.07.09
AddDbContextPool 과 AddPooledDbContextFactory  (0) 2024.07.01
[EntityFramework] DbContext 풀링  (0) 2024.07.01

댓글