当前位置:首页 > C# > 正文

C#异步锁详解(SemaphoreSlim使用教程,轻松掌握异步并发控制)

在现代 C# 开发中,异步编程 已成为处理高并发、高性能应用的标准方式。然而,当多个异步任务需要访问共享资源时,如何安全地控制并发访问就变得至关重要。这时,我们就需要用到 C#异步锁 —— SemaphoreSlim

本文将带你从零开始,深入浅出地学习 SemaphoreSlim使用教程,即使你是编程小白,也能轻松上手!

C#异步锁详解(SemaphoreSlim使用教程,轻松掌握异步并发控制) C#异步锁 SemaphoreSlim使用教程 异步编程 C#并发控制 第1张

什么是 SemaphoreSlim?

SemaphoreSlim 是 .NET 提供的一个轻量级信号量类,专为异步场景设计。它允许你限制同时访问某段代码或资源的线程(或任务)数量。

与传统的 lock 只允许一个线程进入不同,SemaphoreSlim 可以设置“许可证”数量,比如最多允许 3 个任务同时执行某段代码。

基本用法

创建一个 SemaphoreSlim 非常简单:

// 允许最多 2 个并发任务var semaphore = new SemaphoreSlim(2, 2);

第一个参数是初始可用的“许可证”数量,第二个是最大数量(通常两者相同)。

异步等待与释放

在异步方法中,我们使用 WaitAsync() 来异步等待获取许可证,并在使用完后调用 Release() 释放它。

private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(2, 2);public async Task DoWorkAsync(int taskId){    await _semaphore.WaitAsync(); // 异步等待获取许可证    try    {        Console.WriteLine($"任务 {taskId} 开始执行...");        await Task.Delay(2000); // 模拟耗时操作        Console.WriteLine($"任务 {taskId} 执行完毕。");    }    finally    {        _semaphore.Release(); // 一定要在 finally 中释放!    }}

注意:必须在 finally 块中调用 Release(),确保即使发生异常也能正确释放许可证,避免死锁。

完整示例:模拟并发访问数据库

假设你有一个数据库连接池,最多只允许 3 个并发请求:

using System;using System.Threading;using System.Threading.Tasks;class Program{    private static readonly SemaphoreSlim _dbSemaphore = new SemaphoreSlim(3, 3);    static async Task Main(string[] args)    {        var tasks = new Task[10];        for (int i = 0; i < 10; i++)        {            int taskId = i;            tasks[i] = AccessDatabaseAsync(taskId);        }        await Task.WhenAll(tasks);        Console.WriteLine("所有任务完成!");    }    static async Task AccessDatabaseAsync(int id)    {        await _dbSemaphore.WaitAsync();        try        {            Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 任务 {id} 正在访问数据库...");            await Task.Delay(1000); // 模拟数据库操作            Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 任务 {id} 数据库操作完成。");        }        finally        {            _dbSemaphore.Release();        }    }}

运行这段代码,你会发现最多只有 3 个任务同时输出“正在访问数据库”,这正是 C#并发控制 的体现。

常见误区与最佳实践

  • 不要忘记 Release():否则许可证会耗尽,后续任务永远无法进入。
  • 使用 using 语句?:遗憾的是 SemaphoreSlim 不实现 IDisposable 的自动管理模式,所以必须手动配对 WaitAsyncRelease
  • 避免同步阻塞:不要在异步方法中使用 Wait(),而应始终使用 WaitAsync(),防止线程阻塞。

总结

SemaphoreSlim 是 C# 异步编程中实现资源并发控制的强大工具。通过合理设置许可证数量,你可以有效防止资源过载,提升系统稳定性。

记住关键词:C#异步锁SemaphoreSlim使用教程异步编程C#并发控制——它们是你掌握这一技术的核心。

现在,你已经可以自信地在项目中使用 SemaphoreSlim 来保护你的共享资源了!