ManualResetEvent
来源:互联网 发布:手机txt编辑软件 编辑:程序博客网 时间:2024/06/05 20:55
具体查看: http://wenku.baidu.com/view/8eb24b1755270722192ef7bd.html
http://www.cnblogs.com/sashow/archive/2007/02/08/645016.html
先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容,来做对比:
ManualResetEvent都可以阻塞一个或多个线程,直到收到一个信号告诉ManualResetEvent不要再阻塞当前的线程。
可以想象ManualResetEvent这个对象内部有一个Boolean类型的属性IsRelease来控制是否要阻塞当前线程。这个属性我们在初始化的时候可以设置它,如ManualResetEvent event=new ManualResetEvent(false);这就表明默认的属性是要阻塞当前线程。
代码举例:
ManualResetEvent _manualResetEvent = new ManualResetEvent(false);
private void BT_Temp_Click(object sender, RoutedEventArgs e)
{
Thread t1 = new Thread(this.Thread1Foo);
t1.Start(); //启动线程1
Thread t2 = new Thread(this.Thread2Foo);
t2.Start(); //启动线程2
Thread.Sleep(3000); //睡眠当前主线程,即调用BT_Temp_Click的线程
_manualResetEvent .Set(); //想象成将IsRelease设为True
}
void Thread1Foo()
{
_manualResetEvent .WaitOne();
//阻塞线程1,直到主线程发信号给线程1,告知_menuResetEvent你的IsRelease属性已经为true,
//这时不再阻塞线程1,程序继续往下跑
MessageBox.Show("t1 end");
}
void Thread2Foo()
{
_manualResetEvent .WaitOne();
//阻塞线程2,直到主线程发信号给线程1,告知_menuResetEvent你的IsRelease属性已经为true,
//这时不再阻塞线程2,程序继续往下跑
MessageBox.Show("t2 end");
}
注意这里ManualResetEvent和AutoResetEvent的一个重要区别:
manual的话肯定会给线程1和线程2都发送一个信号,而auto只会随机给其中一个发送信号。
为什么一个叫manual而一个叫auto呢?我想这是很多人的疑问,现在我们就来看这个问题。
刚才_manualResetEvent .Set();的这句话我想大家都明白了,可以看做将IsRelease的属性设置为true.线程1中
_manualResetEvent.WaitOne();接收到信号后不再阻塞线程1。在此之后的整个过程中IsRelease的值都是true.如果
想将IsRelease的值回复成false,就必须再调用_manualResetEvent.Reset()的方法。
如果是_autoResetEvent.set(),那么_autoResetEvent.WaitOne()后会自动将IsRelease的值自动设置为false.
这就是为什么一个叫auto,一个叫manual.
- ManualResetEvent
- ManualResetEvent
- ManualResetEvent
- ManualResetEvent
- ManualResetEvent
- ManualResetEvent
- ManualResetEvent用法
- ManualResetEvent用法
- ManualResetEvent用法
- ManualResetEvent Class
- AutoResetEvent&&ManualResetEvent
- ManualResetEvent详解
- ManualResetEvent详解
- Java:ManualResetEvent
- ManualResetEvent 说明
- ManualResetEvent详解
- ManualResetEvent详解
- 理解ManualResetEvent
- 豆瓣网技术架构发展历程
- 在VC++中混用C++异常和结构化异常
- unhandled exception in:0xC0000005:Acess Violation
- Non-terminating decimal expansion; no exact representable decimal result.
- PLSQL高效设计之exists和in
- ManualResetEvent
- 分层Pane结构与Swing组件高级特性的实现
- 控制台程序的管道重定向
- MongoDB学习笔记(一) MongoDB介绍及安装
- 指针的应用(zlg)
- 在centos防火墙内禁止某IP的访问
- selector 的 问题
- 解决无法定位程序输入点 _Z17qt_message_output9QtMsgTypePKc 于动态链接QtCore4.dll库上
- build path--use as source folder