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 @ 2016-11-04 10:29  梦醒江南·Infinite  阅读(505)  评论(0)    收藏  举报