信号量 C# 多线程访问之 SemaphoreSlim【C# 进阶】

SemaphoreSlim 是对可同时访问某一共享资源或资源池的线程数加以限制的 Semaphore 的轻量替代,也可在等待时间预计很短的情况下用于在单个进程内等待 。
由于 SemaphoreSlim 更加轻量、快速,因此推荐使用,本文也着重介绍 。
一、简介相较于线程锁的使一块代码只能一个线程访问,SemaphoreSlim 则是让同一块代码让多个线程同时访问,并且总数量可控 。
SemaphoreSlim 尽可能多地依赖公共语言运行时 (CLR) 提供的同步基元 。还提供延迟初始化、基于内核的等待句柄 。
SemaphoreSlim 也支持使用取消标记,但不支持命名信号量或使用用于同步的等待句柄 。
线程通过调用从 WaitHandle 类中继承的 WaitOne 方法进入信号量,无论对于 System.Threading.Semaphore 对象、SemaphoreSlim.Wait 或 SemaphoreSlim.WaitAsync 方法还是 SemaphoreSlim 对象都适用 。
当调用返回时,信号量计数会减少,当线程请求进入且计数为零时,此线程受到阻止 。线程通过调用 Semaphore.Release 或 SemaphoreSlim.Release 方法释放信号量时,允许受阻线程进入,此时信号量计数会增加 。
受阻线程进入信号量无保证的顺序,比如先进先出 (FIFO) 或按后进先出 (LIFO) 。
二、用法示例关于 SemaphoreSlim、Wait()、Release() 的一个示例 。

    经验总结扩展阅读