一个实例明白AutoResetEvent和 ManulResetEvent的用法

先看一段代码:
InBlock.gif public  class WaitHandlerExample { 
InBlock.gif                 public  static AutoResetEvent waitHandler; 
InBlock.gif                 public  static ManualResetEvent manualWaitHandler; 
InBlock.gif 
InBlock.gif                 public  static  void ThreadPoolMain() { 
InBlock.gif                        waitHandler =  new AutoResetEvent( false); 
InBlock.gif                        manualWaitHandler =  new ManualResetEvent( false); 
InBlock.gif 
InBlock.gif                         // Queue the task. 
InBlock.gif                        ThreadPool.QueueUserWorkItem( new WaitCallback(ThreadProc));             
InBlock.gif                        ThreadPool.QueueUserWorkItem( new WaitCallback(ThreadProc2)); 
InBlock.gif 
InBlock.gif                        Console.WriteLine( "Main thread does some work, then waiting...."); 
InBlock.gif                        manualWaitHandler.WaitOne(); 
InBlock.gif                         //waitHandler.Reset(); 
InBlock.gif                        manualWaitHandler.WaitOne(); 
InBlock.gif                         //waitHandler.Reset(); 
InBlock.gif                        Console.WriteLine( "Main thread exits."); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 // This thread procedure performs the task. 
InBlock.gif                 public  static  void ThreadProc(Object stateInfo) { 
InBlock.gif                        Thread.Sleep(1000); 
InBlock.gif                        Console.WriteLine( "Hello from the thread pool."); 
InBlock.gif                         //waitHandler.Set();        // 
InBlock.gif                        manualWaitHandler.Set(); //过去了,但是没关,也就是说 信号还是开着的。 
InBlock.gif                         //manualWaitHandler.Reset(); 
InBlock.gif                } 
InBlock.gif                 public  static  void ThreadProc2( object stateInfo) { 
InBlock.gif                        Thread.Sleep(100); 
InBlock.gif                        Console.WriteLine( "Hello from the thread Pool2"); 
InBlock.gif                         //waitHandler.Set(); 
InBlock.gif                        manualWaitHandler.Set(); //过去了,但是没有关 
InBlock.gif                } 
InBlock.gif        }
如果把 AutoResetEvent 比作 北京地铁的门闸,那么
AutoResetEvent waitHandler=new AutoResetEvent(false);
可以看作,初始化闸机口为关闭状态,
waitHandler.WaitOne();
可以看作刷卡
waitHandler.Set()
表示通过,并且闸机自动关闭(AutoReset)为下次通过做准备。他的一个重大的好处,就是线程只能一个一个通过,保持了顺序又避免了死锁。
 
如果使用manualResetEvent 呢,那么在waitHandler.Set 之后,必须调用Reset()方法,为下面一位进去做好准备, 否则,就相当于无法再次刷卡。
 
体现在程序中就是,AutoResetEvent 可以WaitOne 很多次,可是ManualResetEvent 如果不Reset 下次就不能使用. 这就是他们的区别。



本文转自 xhinkerx 51CTO博客,原文链接:http://blog.51cto.com/xhinker/180377,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值