• 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

  • 相关阅读:
    Ionic3 遇到的一些错误-Error: Cannot find module 'reflect-metadata'
    Ionic3 遇到的一些错误-submodule update -q --init --recursive
    Ionic3 一些命令
    Npm 使用淘宝镜像
    在PHP中使用AES加密算法加密数据-2
    php实现AES/CBC/PKCS5Padding加密解密(又叫:对称加密)-1
    php rsa加密解密实例
    composer 安装Laravel、thinkphp5.1
    PHP原生分页的编写
    微信授权登录并获取用户信息接口开发
  • 原文地址:https://www.cnblogs.com/144823836yj/p/6029322.html
Copyright © 2020-2023  润新知