You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:37:38