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); } }