.NET SDK是否有等效AsyncEx AsyncLock的官方异步锁实现?
官方异步锁的现状与替代方案
微软官方支持情况
- 截至2024年,.NET SDK/框架尚未提供直接等效于
lock块的官方异步锁实现——即自带IDisposable释放器、可配合using语句使用的异步互斥原语。 - 微软目前没有公开明确的计划,宣布将推出这类官方异步锁组件。
基于官方组件的替代实现
虽然没有现成的官方异步锁类,但可以基于官方提供的SemaphoreSlim封装一个符合需求的实现,让它支持IDisposable和using语法,示例代码如下:
public class AsyncLock : IDisposable { private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); private readonly Task<IDisposable> _releaseTask; public AsyncLock() { _releaseTask = Task.FromResult((IDisposable)new ReleaseHelper(_semaphore)); } public async Task<IDisposable> LockAsync(CancellationToken cancellationToken = default) { await _semaphore.WaitAsync(cancellationToken); return _releaseTask.Result; } private class ReleaseHelper : IDisposable { private readonly SemaphoreSlim _semaphore; private bool _disposed; public ReleaseHelper(SemaphoreSlim semaphore) { _semaphore = semaphore; } public void Dispose() { if (!_disposed) { _semaphore.Release(); _disposed = true; } } } public void Dispose() { _semaphore.Dispose(); } }
使用方式和标准lock块逻辑一致:
private readonly AsyncLock _asyncLock = new AsyncLock(); public async Task DoAsyncWork() { using (await _asyncLock.LockAsync()) { // 异步临界区代码 } }
补充说明
SemaphoreSlim是官方提供的轻量级异步同步原语,本身线程安全,封装后的实现完全基于官方组件,稳定性有保障。- 若允许使用第三方库,AsyncEx的
AsyncLock是社区广泛验证的成熟实现,但它不属于.NET官方SDK范畴。
内容的提问来源于stack exchange,提问作者Jez
相关产品推荐
相关产品推荐

