1. SemaphoreSlim:.NET异步世界的流量警察
第一次遇到SemaphoreSlim是在一个电商促销日的凌晨。当时我们的库存服务突然崩溃,日志里满是"Too many connections"的报错——几十个微服务实例同时抢购数据库连接,把连接池直接打爆。凌晨三点用SemaphoreSlim重构代码后,系统就像被装上了智能红绿灯,混乱的交通立刻变得井然有序。这个经历让我深刻体会到,在异步编程的世界里,SemaphoreSlim就是那个维持秩序的"流量警察"。
与老牌的Semaphore类不同,SemaphoreSlim是.NET 4.0专为异步场景设计的轻量级选手。它体重不到Semaphore的1/3(内存占用约40字节 vs 120字节),不依赖操作系统内核对象,特别适合高频、短期的并发控制场景。实测在限制数据库连接池访问的案例中,使用SemaphoreSlim的吞吐量比Semaphore高出近60%。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心机制解析
2.1 信号量的红绿灯原理
想象一个网红奶茶店,店里只有5个制作工位(资源数)。SemaphoreSlim就像店门口的领位员,手里攥着一叠号码牌(CurrentCount)。每个顾客(线程)进店前要先领牌,没有牌就得在门口排队(WaitAsync)。当顾客离店时会把牌还回去(Release),唤醒排队的下一位。
csharp复制// 创建只有5个许可的信号量
var semaphore = new SemaphoreSlim(initialCount: 5, maxCount: 5);
// 异步获取许可
await semaphore.WaitAsync(); // 如果没许可会异步等待
try {
// 使用受保护的资源
} finally {
semaphore.Release(); // 务必在finally中释放!
}
关键细节:初始计数(initialCount)和最大计数(maxCount)可以不同。比如设置initialCount=0实现"需要手动解锁"的场景。
2.2 异步等待的魔法实现
传统Semaphore的Wait会阻塞线程,而SemaphoreSlim的WaitAsync内部采用TaskCompletionSource实现真
