先看一段代码:
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 下次就不能使用. 这就是他们的区别。

一个实例明白AutoResetEvent和 ManulResetEvent的用法的更多相关文章

  1. Java程序只运行一个实例[转]

    如果希望你的Java程序只能存在一个实例,可以参考下面的用法. 原文链接:http://blog.csdn.net/yaerfeng/article/details/7264729 Java没有提供这 ...

  2. 多线程随笔一(AutoResetEvent和ManulResetEvent)

    AutoResetEvent和ManulResetEvent是.net中用来做线程的同步的两个类.从类名上不难看出,这两个类的区别在于一个是自动的,一个是手动的(这不是废话嘛).两个类的实现原理大致相 ...

  3. 学习MQ(三) 一个实例

    学习MQ(三) 一个实例. 现在有两台机器A和B,分别安装了MQ6.0,我要通过MQ进行A和B之间的双向通信. 我打算分两步,第一步:实现A到B的数据传输. 在A上: 1.创建队列管理器 QM_100 ...

  4. ToolkitScriptManager vs. ScriptManager 关于“只能向页面中添加 ScriptManager 的一个实例”讨论

    在使用ASP.NET设计AJAX功能网页时,需要首先声明ToolkitScriptManager或者ScriptManager控件,这些全局的脚本核心控制,然后才能使用众多的AJAX控件.如果没有创建 ...

  5. 如何用Qt写一个同一时间只能运行一个实例的应用程序

    http://blog.sina.com.cn/s/blog_6343941a0100nk2x.html 可以达到的目的: 1.应用只启动一个实例,依赖于QtNetwork模块 2.启动时向另一个实例 ...

  6. Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。

                                                                                                        ...

  7. 逆向学习XXclient怎样仅仅执行一个实例

    个人觉得学习分两种, 一种是当面请教和直接从书本网络中的资料学习. 其二就是看着令你惊叹的作品-顿悟. 什么?顿悟不了?那我们就一起来逆向学习吧!差点忘了,我并不打算提供Demo,这并不重要,难道你打 ...

  8. VC 实现程序只运行一个实例,并激活已运行的程序

    转载:http://blog.sina.com.cn/s/blog_4b44e1c00100bh69.html 进程的互斥运行:CreateMutex函数实现只运行一个程序实例 正常情况下,一个进程的 ...

  9. C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper

    前言 在开发应用程序时,通常只让程序运行一个实例.所以,就要判断程序是否已经运行. 下面是我自己在项目中使用到,封装好的帮助类.有 普通的 C# 应用程序 和 Windows CE 和 Windows ...

随机推荐

  1. GIS大讲堂内所有讲座的索引(更新至2008年6月26日)(转)

    转自:http://www.cnblogs.com/xiexiaokui/archive/2008/11/20/1337934.html GIS大讲堂内所有讲座的索引(更新至2008年6月26日)   ...

  2. Java中Map遍历的四种方案

    在Java中如何遍历Map对象 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> map = new HashM ...

  3. java NIO 资料总结

    1.http://developer.51cto.com/art/201204/328340.htm 2.http://ifeve.com/file-channel/并发编程网系列 3 http:// ...

  4. Centos6.x X64 飞信安装

    Centos6.x X64 飞信安装 1,安装飞信依赖包 yum -y install glibc.i686 krb5-libs.i686 libstdc++.i686 zlib.i686 --set ...

  5. MAC 下安装opencv遇到问题的解决方法(安装homebrew, wget)

    遇到问题: (1)Mac安装OpenCV下载ippicv_macosx_20141027.tgz失败解决方案 先附上当时的报错信息: -- ICV: Downloading ippicv_macosx ...

  6. storm的acker机制理解

    转载请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/6142356.html Storm 的拓扑有一些特殊的称为"acker"的任务,这 ...

  7. HDOJ--4786--Fibonacci Tree【生成树】

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:给出n个点,m条边,和边的信息. 边有两种颜色,白色和黑色.现要求构造一个生成树.看是否能满足 ...

  8. C#写的笔记管理软件

    在VS2008中做的 附件:http://ys-e.ys168.com/2.0/276581430/j4G4J63367LMMJUJjsgW/CSHARP_WinCtrl21t_2014%E5%B9% ...

  9. hdu2018java

    母牛的故事 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  10. android开发之自定义AutoCompleteTextView

    AutoCompleteTextView,很多人都用过,有些情况下使用Google提供的ArrayAdapter作为适配器就可以完成需求,但是在实际开发中,我们经常需要开发自定义适配器来完成开发工作. ...