AutoResetEvent也是一个同步对象,它用于对资源的独占访问。
当AutoResetEvent处于终止状态时,如果存在等待的线程,则在该线程执行后,AutoResetEvent变量将自动变为非终止状态。
代码示例:

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;
}
}
{
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;
}
}
代码中,我们关注AutoResetEvent同步对象。从代码中我们可以看到 CalFirst、CalSec、CalThird方法中 都有一句AutoEvents[].Set()代码,这句代码就是通知等待该信号的线程,我已经完成我的任务,你可以获得该信号了,也就是说你执行你自己 任务的把握又大了一些。
在result方法中,我们可以看到WaitHanle.WatiAll()代码,这句代码说明result方法呢,在等待所有的信号变量都变成终止状态,这样他就可以执行自己的代码了。
执行结果:
可以看到结果,result是在其他三个方法执行完之后才执行的。