在现代 C# 开发中,异步编程 已成为处理高并发、高性能应用的标准方式。然而,当多个异步任务需要访问共享资源时,如何安全地控制并发访问就变得至关重要。这时,我们就需要用到 C#异步锁 —— SemaphoreSlim。
本文将带你从零开始,深入浅出地学习 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#并发控制 的体现。
SemaphoreSlim 不实现 IDisposable 的自动管理模式,所以必须手动配对 WaitAsync 和 Release。Wait(),而应始终使用 WaitAsync(),防止线程阻塞。SemaphoreSlim 是 C# 异步编程中实现资源并发控制的强大工具。通过合理设置许可证数量,你可以有效防止资源过载,提升系统稳定性。
记住关键词:C#异步锁、SemaphoreSlim使用教程、异步编程、C#并发控制——它们是你掌握这一技术的核心。
现在,你已经可以自信地在项目中使用 SemaphoreSlim 来保护你的共享资源了!
本文由主机测评网于2025-12-20发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251210705.html