
using System;

using System.Collections.Generic;

using System.Text;

using System.Threading;

namespace StartThread

{

//下面的代码摘自MSDN,笔者做了中文代码注释

//周公

public class EventWaitHandleDemo

{

double baseNumber, firstTerm, secondTerm, thirdTerm;

AutoResetEvent[] autoEvents;

ManualResetEvent manualEvent;

//产生随机数的类.

Random random;

static void Main()

{

EventWaitHandleDemo ewhd = new EventWaitHandleDemo();

Console.WriteLine( "Result = {0}.",

ewhd.Result(234).ToString());

Console.WriteLine( "Result = {0}.",

ewhd.Result(55).ToString());

Console.ReadLine();

}

//构造函数

public EventWaitHandleDemo()

{

autoEvents = new AutoResetEvent[]

{

new AutoResetEvent( false),

new AutoResetEvent( false),

new AutoResetEvent( false)

};

manualEvent = new ManualResetEvent( false);

}

//计算基数

void CalculateBase( object stateInfo)

{

baseNumber = random.NextDouble();

//指示基数已经算好.

manualEvent.Set();

}

//计算第一项

void CalculateFirstTerm( object stateInfo)

{

//生成随机数

double preCalc = random.NextDouble();

//等待基数以便计算.

manualEvent.WaitOne();

//通过preCalc和baseNumber计算第一项.

firstTerm = preCalc * baseNumber *random.NextDouble();

//发出信号指示计算完成.

autoEvents[0].Set();

}

//计算第二项

void CalculateSecondTerm( object stateInfo)

{

double preCalc = random.NextDouble();

manualEvent.WaitOne();

secondTerm = preCalc * baseNumber *random.NextDouble();

autoEvents[1].Set();

}

//计算第三项

void CalculateThirdTerm( object stateInfo)

{

double preCalc = random.NextDouble();

manualEvent.WaitOne();

thirdTerm = preCalc * baseNumber *random.NextDouble();

autoEvents[2].Set();

}

//计算结果

public double Result( int seed)

{

random = new Random(seed);

//同时计算

ThreadPool.QueueUserWorkItem( new WaitCallback(CalculateFirstTerm));

ThreadPool.QueueUserWorkItem( new WaitCallback(CalculateSecondTerm));

ThreadPool.QueueUserWorkItem( new WaitCallback(CalculateThirdTerm));

ThreadPool.QueueUserWorkItem( new WaitCallback(CalculateBase));

//等待所有的信号.

WaitHandle.WaitAll(autoEvents);

//重置信号,以便等待下一次计算.

manualEvent.Reset();

//返回计算结果

return firstTerm + secondTerm + thirdTerm;

}

}

}