C# semphore的使用

  ”信号量非常类似于互斥,信号量可以同时由多个线程使用

  信号量是一种计数的互斥锁定,可以定义允许同时访问受旗语锁定保护的资源的线程个数。

  如果需要限制可用资源的线程数,信号量就非常有用。例如,如果系统有3个物理端口可用,就允许3个线程同时访问I/O端口,但第4个线程就需要等待前3个线程中的一个释放资源。

  .NET4.5位信号量功能提供了两个类Semphore和SemphoreSlim。Semphore类可以命名,使用系统内的资源,允许在不同进程之间同步。SemphoreSlim类对较短等待时间进行了优化的轻型版本。”

复制代码
using System;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Threading;


namespace UnitTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int taskCount = 6;
            int semaphoreCount = 3;
            var semaphore = new SemaphoreSlim(3,3);
            var tasks = new Task[taskCount];

            for (int i = 0; i < taskCount; i++)
            {

                tasks[i] = Task.Factory.StartNew(()=>TaskMain(semaphore));
            }

           Task.WaitAll(tasks);

            Console.ReadLine();
        }


        static void TaskMain(SemaphoreSlim semaphore)
        {
            bool isCompleted = false;
            while (!isCompleted)
            {
                if (semaphore.Wait(600))
                {
                    try
                    {  
                        Console.WriteLine("Task {0} locks ths semphore {1}", Task.CurrentId,DateTime.Now.ToString("  HH:mm:ss.ffff")+" "+Task.CurrentId);          

                      
                        Thread.Sleep(2000);
                    }
                    finally
                    {
                        Console.WriteLine("Task {0} release the semphoreb {1}", Task.CurrentId,DateTime.Now.ToString("  HH:mm:ss.ffff"));
                        semaphore.Release();
                        isCompleted = true;
                    }
                }
                else
                { 
                    Console.WriteLine("Timeout for task {0};wait again  {1}",Task.CurrentId,DateTime.Now.ToString("  HH:mm:ss.ffff"));

                   
                }
            }
        }
    }
}
复制代码

参考:《C#高级编程》(第9版)P593

posted @   梦醒江南·Infinite  阅读(494)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示