C#旌旗燈號量用法簡略示例。本站提示廣大學習愛好者:(C#旌旗燈號量用法簡略示例)文章只能為提供參考,不一定能成為您想要的結果。以下是C#旌旗燈號量用法簡略示例正文
本文實例講述了C#旌旗燈號量用法。分享給年夜家供年夜家參考,詳細以下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
/*
* 題目:若何應用旌旗燈號量的示例代碼
* Author:kagula
* Date:2015-6-16
* Environment:VS2010SP1, .NET Framework 4 client profile, C#.
* Note:[1]“旌旗燈號量”可以算作是“受權(證)池”。
* 一個受權(證)池內有零個或多個受權(證)。
* [2]上面的示例sem of Semaphore相當於最多只能有一個受權(證)的受權池。
* [3]每挪用一次sem.Release添加一個受權(證)。
* 銜接挪用屢次sem.Release招致超越受權池所能包容的受權(證)數目,會拋出異常。
* [4]每挪用一次sem.WaitOne就應用一個受權(證)。
* */
namespace kagula
{
class mySemaphore
{
//第一個參數,代表以後受權次數。
// 0表現沒有受權(證)。
//第二個參數,代表Semaphore實例最多能包容幾個受權證。
// 1表現最年夜受權次數為1次。
// 超越許可的受權次數,好比說sem.Release持續挪用了兩次,會拋出異常。
public static Semaphore sem = new Semaphore(0, 1);
public static void Main()
{
//添加一次受權。
//釋放一個sem.WaitOne()的壅塞。
sem.Release();
myThread mythrd1 = new myThread("Thrd #1");
myThread mythrd2 = new myThread("Thrd #2");
myThread mythrd3 = new myThread("Thrd #3");
myThread mythrd4 = new myThread("Thrd #4");
mythrd1.thrd.Join();
mythrd2.thrd.Join();
mythrd3.thrd.Join();
mythrd4.thrd.Join();
//input any key to continue...
Console.ReadKey();
}//end main function
}//end main class
class myThread
{
public Thread thrd;
public myThread(string name)
{
thrd = new Thread(this.run);
thrd.Name = name;
thrd.Start();
}
void run()
{
Console.WriteLine(thrd.Name + "正在期待一個允許(證)……");
//假如不加參數會招致無窮期待。
if (mySemaphore.sem.WaitOne(1000))
{
Console.WriteLine(thrd.Name + "請求到允許(證)……");
Thread.Sleep(500);
//固然上面添加了允許,然則,其它線程能夠沒拿到允許,超時加入了。
Console.WriteLine(thrd.Name + "添加一個允許(證)……");
mySemaphore.sem.Release();
}
else
{
Console.WriteLine(thrd.Name + " 超時(等了一段時光照樣沒拿到允許(證))加入……");
}
}
}//end class
}//end namespace
願望本文所述對年夜家C#法式設計有所贊助。