文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Thread系列——ManualResetEvent

Thread系列——ManualResetEvent

时间:2010-10-21  来源:m苗子

 

ManualResetEvent状态分为两种:终止状态和非终止状态。当某一任务完成时,将ManualResetEvent设置为终止状态,这样其他等待的线程(一个或多个)将开始执行自己的任务。

 

注意:一旦它被终止,它将保持终止状态,直到它被手动重置。

 

代码示例:

 

代码
 class Program
{
static void Main(string[] args)
{
Caclultae calc
= new Caclultae();
Console.WriteLine(
"Result={0}",calc.result(234).ToString());

Console.Read();
}
}
class Caclultae
{
double baseNum,firNum,secNum,thdNum;
AutoResetEvent[] autoEvents;
ManualResetEvent manualEvent;
Random Generator;
public Caclultae()
{
autoEvents
= new AutoResetEvent[]
{
new AutoResetEvent(false),
new AutoResetEvent(false),
new AutoResetEvent(false)
};
manualEvent
= new ManualResetEvent(false);
}
void CalBase(object stateInfo)
{
baseNum
= Generator.NextDouble();
Console.WriteLine(
"BaseNum is Ok");
manualEvent.Set();
}
void CalFirst(object stateInfo)
{
double preCalc = Generator.NextDouble();

manualEvent.WaitOne();
Console.WriteLine(
"FirstNum begins to Calculate");
firNum
= preCalc * baseNum * Generator.NextDouble();

autoEvents[
0].Set();
Console.WriteLine(
"FirstNum Calculates successfully");
}
void CalSec(object stateInfo)
{
double preCalc = Generator.NextDouble();
manualEvent.WaitOne();
Console.WriteLine(
"SecNum begins to Calculate");
secNum
= preCalc * baseNum * Generator.NextDouble();
autoEvents[
1].Set();
Console.WriteLine(
"SecNum Calculates successfully");
}
void CalThird(object stateInfo)
{
double preCalc = Generator.NextDouble();
manualEvent.WaitOne();
Console.WriteLine(
"ThrdNum begins to Calculate");
thdNum
= preCalc * baseNum * Generator.NextDouble();
autoEvents[
2].Set();
Console.WriteLine(
"ThrdNum Calculates successfully");
}
public double result(int seed)
{
Generator
= new Random(seed);
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalBase));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalFirst));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalSec));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalThird));
WaitHandle.WaitAll(autoEvents);
manualEvent.Reset();
return firNum + secNum + thdNum;
}

}

 

代码中,我们可以看到,CalFirst,CalSec,CalThird都在等待CalBase执行完成。当CalBase计算出BaseNum的结果之后,将ManualResetEvent变量设置为终止状态,通知其他三个任务,可以执行他们自己的任务了。

执行结果:

1).执行一次的结果:

 

2). 再次执行的结果:

 

从两次执行结果中看出,CalFirst、CalSec、CalThird的执行顺序是不一定的,也就是说 这三个的地位是相同的,都在等待CalBase执行成功,从而执行自己的任务。这也验证了 ManualResetEvent的作用,用于通知一个或多个线程某个事件发生。

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载