您可以使用
SemaphoreSlim1作为请求数。
SemaphoreSlim允许
async使用
WaitAsync和同步方式锁定:
await _semphore.WaitAsync()try{ ... use shared resource.}finally{ _semphore.Release()}您还可以
AsyncLock根据Stephen
Toub的出色文章《构建异步协调基元》第6部分:AsyncLock编写自己的文章。我在应用程序中做到了这一点,并允许在同一构造上进行同步和异步锁定。
用法:
// Asyncusing (await _asyncLock.LockAsync()){ ... use shared resource.}// Synchronoususing (_asyncLock.Lock()){ ... use shared resource.}实现方式:
class AsyncLock{ private readonly Task<IDisposable> _releaserTask; private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); private readonly IDisposable _releaser; public AsyncLock() { _releaser = new Releaser(_semaphore); _releaserTask = Task.FromResult(_releaser); } public IDisposable Lock() { _semaphore.Wait(); return _releaser; } public Task<IDisposable> LockAsync() { var waitTask = _semaphore.WaitAsync(); return waitTask.IsCompleted ? _releaserTask : waitTask.ContinueWith( (_, releaser) => (IDisposable) releaser, _releaser, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default); } private class Releaser : IDisposable { private readonly SemaphoreSlim _semaphore; public Releaser(SemaphoreSlim semaphore) { _semaphore = semaphore; } public void Dispose() { _semaphore.Release(); } }}


