信号量-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); }
复制代码
原文地址:https://www.cnblogs.com/bruce1992/p/14348914.html