C#信号量用法简单示例
本文实例讲述了C#信号量用法。分享给大家供大家参考,具体如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading;
/*
*标题:如何使用信号量的示例代码
*Author:kagula
*Date:2015-6-16
*Environment:VS2010SP1,.NETFramework4clientprofile,C#.
*Note:[1]“信号量”可以看成是“授权(证)池”。
*一个授权(证)池内有零个或多个授权(证)。
*[2]下面的示例semofSemaphore相当于最多只能有一个授权(证)的授权池。
*[3]每调用一次sem.Release添加一个授权(证)。
*连接调用多次sem.Release导致超出授权池所能容纳的授权(证)数量,会抛出异常。
*[4]每调用一次sem.WaitOne就使用一个授权(证)。
**/
namespacekagula
{
classmySemaphore
{
//第一个参数,代表当前授权次数。
//0表示没有授权(证)。
//第二个参数,代表Semaphore实例最多能容纳几个授权证。
//1表示最大授权次数为1次。
//超出允许的授权次数,比如说sem.Release连续调用了两次,会抛出异常。
publicstaticSemaphoresem=newSemaphore(0,1);
publicstaticvoidMain()
{
//添加一次授权。
//释放一个sem.WaitOne()的阻塞。
sem.Release();
myThreadmythrd1=newmyThread("Thrd#1");
myThreadmythrd2=newmyThread("Thrd#2");
myThreadmythrd3=newmyThread("Thrd#3");
myThreadmythrd4=newmyThread("Thrd#4");
mythrd1.thrd.Join();
mythrd2.thrd.Join();
mythrd3.thrd.Join();
mythrd4.thrd.Join();
//inputanykeytocontinue...
Console.ReadKey();
}//endmainfunction
}//endmainclass
classmyThread
{
publicThreadthrd;
publicmyThread(stringname)
{
thrd=newThread(this.run);
thrd.Name=name;
thrd.Start();
}
voidrun()
{
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+"超时(等了一段时间还是没拿到许可(证))退出……");
}
}
}//endclass
}//endnamespace
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#程序设计之线程使用技巧总结》、《C#操作Excel技巧总结》、《C#中XML文件操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#数组操作技巧总结》及《C#面向对象程序设计入门教程》
希望本文所述对大家C#程序设计有所帮助。