EventWaitHandle 自己的小结

   一直对于实例化EventWaitHandle对象是后传入是否为终止状态,手动或者自动的情况不是很清楚,所以,研究了一下做个笔记。

  EventWaitHandle各个线程程之间互通信号。

 首先:如果事件初始为终止状态,首次waitone()时候不进行线程阻塞,为非终止状态时候,首次waitone()时候进行线程阻塞。当然,该状态也要结合一下的EventResetMode的值进行结合使用。

 EventResetMode.AutoReset 自动重置,也就是自动重置事件状态,自动的话,他会在首次waitone之后立即改变事件为非终止状态。就像这样{如果手动重置事件的初始化为终止状态,则首次waitone()不进行线程阻塞,但是会立即改变事件状态的状态为非终止状态,当以后waitone()的时候,都会阻塞线程}

EventResetMode.ManualReset 手动重置,它对于线程的阻塞决定于上一个参数是否为终止状态,也就是说,如果初始值设置为终止状态,则它的线程如果不手动进行手动设置,则一直不进行线程阻塞,如果初始值是非终止状态,则每个waione()都会阻塞,除非手动使用set()之类的方法设置为终止状态为止。

下面贴出代码示例:

    class Program
    {
        //static EventWaitHandle wait = new EventWaitHandle(true, EventResetMode.AutoReset);  //自动  中止状态
        
        static EventWaitHandle waitM = new EventWaitHandle(false, EventResetMode.ManualReset);//手动   非终止状态
        static void Main(string[] args)
        {
            Console.WriteLine("1当前时间" + DateTime.Now);
            Thread thread = new Thread(S);
            thread.Start();

            Thread.Sleep(3000);
            //wait.Set();//将状态设置为终止状态。
            waitM.Set();   //将状态设置为终止状态。
            Console.Read();
        }
        public static void S()
        {
            waitM.WaitOne(3000);   //非终止状态,无限制阻塞线程,不自动改变事件的终止状态
           //wait.WaitOne();  //自动返回为终止状态,不阻塞线程,为同一时间
            Console.WriteLine("2当前时间" + DateTime.Now);

           waitM.WaitOne(3000);  //前面的set()将事件手动终止状态,不进行阻塞
           //  wait.WaitOne(3000);  //此时为非终止状态,停顿三秒
            Console.WriteLine("3当前时间" + DateTime.Now);

        }
    }

 

  

posted on 2012-11-06 17:53  abc+  阅读(3075)  评论(2编辑  收藏  举报

导航

杨阳加油 加油 加油 加油 加油 加油 加油 加油 杨阳