zoukankan      html  css  js  c++  java
  • 一个实例明白AutoResetEvent和 ManulResetEvent的用法

    先看一段代码:
    public class WaitHandlerExample { 
                    public static AutoResetEvent waitHandler; 
                    public static ManualResetEvent manualWaitHandler; 
     
                    public static void ThreadPoolMain() { 
                            waitHandler = new AutoResetEvent(false); 
                            manualWaitHandler = new ManualResetEvent(false); 
     
                            // Queue the task. 
                            ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));             
                            ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc2)); 
     
                            Console.WriteLine("Main thread does some work, then waiting...."); 
                            manualWaitHandler.WaitOne(); 
                            //waitHandler.Reset(); 
                            manualWaitHandler.WaitOne(); 
                            //waitHandler.Reset(); 
                            Console.WriteLine("Main thread exits."); 
                    } 
     
                    // This thread procedure performs the task. 
                    public static void ThreadProc(Object stateInfo) { 
                            Thread.Sleep(1000); 
                            Console.WriteLine("Hello from the thread pool."); 
                            //waitHandler.Set();        // 
                            manualWaitHandler.Set();//过去了,但是没关,也就是说 信号还是开着的。 
                            //manualWaitHandler.Reset(); 
                    } 
                    public static void ThreadProc2(object stateInfo) { 
                            Thread.Sleep(100); 
                            Console.WriteLine("Hello from the thread Pool2"); 
                            //waitHandler.Set(); 
                            manualWaitHandler.Set();//过去了,但是没有关 
                    } 
            }
    如果把 AutoResetEvent 比作 北京地铁的门闸,那么
    AutoResetEvent waitHandler=new AutoResetEvent(false);
    可以看作,初始化闸机口为关闭状态,
    waitHandler.WaitOne();
    可以看作刷卡
    waitHandler.Set()
    表示通过,并且闸机自动关闭(AutoReset)为下次通过做准备。他的一个重大的好处,就是线程只能一个一个通过,保持了顺序又避免了死锁。
     
    如果使用manualResetEvent 呢,那么在waitHandler.Set 之后,必须调用Reset()方法,为下面一位进去做好准备, 否则,就相当于无法再次刷卡。
     
    体现在程序中就是,AutoResetEvent 可以WaitOne 很多次,可是ManualResetEvent 如果不Reset 下次就不能使用这就是他们的区别。
  • 相关阅读:
    [原创]如何在Windows下安装Bugfree2.0.0.1
    [原创]网站性能优化利器之一"google page speed"
    [原创]下一代Web 应用程序安全性测试工具HP WebInspect简介
    [原创]微软软件项目管理Team Foundation Server之测试人员
    [原创]Yeepay网站安全测试漏洞之跨站脚本注入
    [原创]软件测试过程改进的内容和注意事项
    [原创]快钱99bill网站安全性测试漏洞之“跨站式脚本注入”
    马化腾内部讲座:让产品自己召唤人
    [转贴]可用性测试
    [原创]浅谈缺陷分析的意义和方法
  • 原文地址:https://www.cnblogs.com/gjhjoy/p/3550136.html
Copyright © 2011-2022 走看看