关于AutoResetEvent与ManualResetEvent用法的说明

关于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

原文地址:https://www.cnblogs.com/monkeyZhong/p/14158910.html