在现代 C# 开发中,异步编程(asynchronous programming)已成为处理 I/O 密集型任务、提升应用响应性和性能的重要手段。然而,当多个异步操作需要访问共享资源时,如何保证线程安全就变得至关重要。传统的 lock 关键字在 async/await 场景下无法使用,因为它会阻塞线程,违背了异步非阻塞的设计初衷。为此,.NET 提供了专为异步场景设计的锁机制——SemaphoreSlim 和 AsyncLock。
在同步代码中,我们常用 lock 来保护临界区:
private readonly object _lock = new object();public void DoWork(){ lock (_lock) { // 访问共享资源 }} 但在异步方法中,如果在 lock 块内使用 await,会导致编译错误:
// ❌ 错误!不能在 lock 中使用 awaitpublic async Task DoWorkAsync(){ lock (_lock) { await SomeAsyncOperation(); // 编译错误:CS1626 }} 这是因为 lock 要求在同一个线程上进入和退出,而 await 可能导致方法在不同线程上恢复执行,破坏了锁的语义。
SemaphoreSlim 是 .NET 提供的一个轻量级信号量,支持异步等待(WaitAsync),非常适合用于实现 C#异步锁。
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);public async Task DoWorkAsync(){ await _semaphore.WaitAsync(); try { // 安全地访问共享资源 await SomeAsyncOperation(); } finally { _semaphore.Release(); }} 这里我们将初始计数设为 1,最大计数也为 1,相当于一个互斥锁(Mutex)。WaitAsync() 异步等待获取许可,Release() 释放许可。
为了更接近传统 lock 的使用体验,我们可以封装一个 AsyncLock 类,这在实现 async await并发控制 时非常实用。
public class AsyncLock{ private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); private readonly Task _releaser; public AsyncLock() { _releaser = Task.FromResult((IDisposable)new Releaser(this)); } public async Task LockAsync() { await _semaphore.WaitAsync(); return _releaser.Result; } private sealed class Releaser : IDisposable { private readonly AsyncLock _toRelease; internal Releaser(AsyncLock toRelease) { _toRelease = toRelease; } public void Dispose() { _toRelease._semaphore.Release(); } }} 使用方式非常优雅,配合 using 语句自动释放锁:
private readonly AsyncLock _asyncLock = new AsyncLock();public async Task DoWorkAsync(){ using (await _asyncLock.LockAsync()) { // 安全地访问共享资源 await SomeAsyncOperation(); } // 自动释放锁} try/finally 块中使用 SemaphoreSlim,确保即使发生异常也能释放锁。.Result 或 .Wait())。CancellationToken 支持取消操作:await _semaphore.WaitAsync(cancellationToken);在 C# 异步编程中,正确处理并发访问共享资源是保障程序稳定性的关键。通过 SemaphoreSlim 或自定义 AsyncLock,我们可以实现高效、安全的 异步编程锁机制。掌握这些技术,不仅能提升代码质量,还能有效避免竞态条件和数据不一致问题,是每位 C# 开发者必备的技能。
无论你是初学者还是有经验的开发者,理解并合理运用 C#多线程安全 策略,都将让你的异步应用更加健壮可靠。
本文由主机测评网于2025-12-16发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025128730.html