关于AutoResetEvent与ManualResetEvent用法的说明
这两个类都是EventWaitHandle的子类。
主要也是用于线程同步,先看代码:
class Program { //static AutoResetEvent doEvent = new AutoResetEvent(false); static ManualResetEvent doEvent = new ManualResetEvent(false); static void Main(string[] args) { Thread t1 = new Thread(DoSomething); t1.Start(); Thread t2 = new Thread(DoSomething2); t2.Start(); Thread.Sleep(3000); Console.WriteLine("Begin set AutoResetEvent"); doEvent.Set(); Console.ReadKey(); } static void DoSomething() { doEvent.WaitOne(); Console.WriteLine("thread1 do some"); } static void DoSomething2() { doEvent.WaitOne(); Console.WriteLine("thread2 do some"); } }
结果分析:
假设AutoResetEvent初始设置为true,那么线程就可以执行下去,waitone就不需要等待,
线程1退出后,doEvent自动复位,不会去继续触发信号,所以必须等到再次set后,线程2才会执行。结果如下:
假设AutoResetEvent初始设置为false,必须set后才能让线程得到响应,因为会自动复位,所以不会继续触发,所以只有一个线程可以得到执行。结果如下:
假设是ManualResetEvent,初始设置为true,因为初始就触发,所以线程可以得到响应,又因为他不会自动复位,所以一直处于触发状态,两个线程都会得到响应,要想不触发除非调用Reset函数,结果如下:
假设是ManualResetEvent,初始状态是False,一开始不会触发,线程不会响应,等到set后,线程1,线程2同时得到响应,因为他不会自动复位。
https://files.cnblogs.com/files/monkeyZhong/TestEventHandle.zip