您的位置:首页 > 大数据 > 人工智能

EventWaitHandle 自己的小结

2012-11-06 17:53 281 查看
一直对于实例化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);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐