namespace MarketData.Utils { public class SemaphoreLocker { private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); public async Task LockAsync(Func worker) { await _semaphore.WaitAsync(); try { await worker(); } finally { _semaphore.Release(); } } // overloading variant for non-void methods with return type (generic T) public async Task LockAsync(Func> worker) { await _semaphore.WaitAsync(); try { return await worker(); } finally { _semaphore.Release(); } } } }