信号量-Semaphore、SemaphoreSlim
核心类:Semaphore,通过int数值来控制线程个数。
* 通过观察构造函数 public Semaphore(int initialCount, int maximumCount);:
* initialCount: 可以同时授予的信号量的初始请求数。
* maximumCount: 可以同时授予的信号量的最大请求数。
核心方法:WaitOne和Release
static Semaphore seLock = new Semaphore(1, 1); //只允许一个线程通过 { seLock.WaitOne(); Console.WriteLine(num2++); seLock.Release(); }
SemaphoreSlim:
轻量级的信号量实现SemaphoreSlim,其不但能够更加高效的实现信号量的功能,还提供了一个异步等待的API。
Demo:异步执行不阻塞主线程
//同步执行 static void SemphoreTest() { Task[] tasks = new Task[10]; for (int i = 0; i < 10; i++) { semaphore.Wait(); //模拟做事情况 Console.WriteLine("excute"); Thread.Sleep(1000); semaphore.Release(); } for (int i = 0; i < 10; i++) { Thread.Sleep(1000); Console.WriteLine("------"); } }
//异步执行 static void SemphoreTestAsync() { Task[] tasks = new Task[10]; for (int i = 0; i < 10; i++) { tasks[i] = Task.Run(async () => { await semaphore.WaitAsync(); //模拟做事情况 Console.WriteLine("excute"); Thread.Sleep(1000); semaphore.Release(); }); } for (int i = 0; i < 10; i++) { Thread.Sleep(1000); Console.WriteLine("------"); } Task.WaitAll(tasks); }