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

本文出自 “Xhinker” 博客,转载请与作者联系!

转帖:http://xhinker.blog.51cto.com/640011/180377

转载于:https://www.cnblogs.com/kevinGao/archive/2011/11/29/2270745.html

一个实例明白AutoResetEvent和 ManulResetEvent的用法相关推荐

  1. python回调函数实例详解_Python回调函数用法实例详解

    本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...

  2. 模拟退火算法系列之(二):一个实例

    为什么我的眼里常含泪水?因为我有一个算法不会.为了节约点眼泪,今天我们就来介绍著名的模拟退火算法(Simulated Annealing),它是一种基于蒙特卡洛思想设计的近似求解最优化问题的方法. 这 ...

  3. linux ksh 用户名,实例讲解Linux中ksh的用法

    实例讲解Linux中ksh的用法 发布时间:2008-02-18 20:46:01来源:红联作者:Modegle 熟悉Linux的朋友肯定都知道bash,它是Linux默认的命令行解释程序,熟悉Sol ...

  4. 限制程序只打开一个实例(转载)

    当我们在做一些管理平台类的程序(比如Windows的任务管理器)时,往往需要限制程序只能打开一个实例.解决这个问题的大致思路很简单,无非是在程序打开的时候判断一下是否有与自己相同的进程开着,如果有,则 ...

  5. 众所周知,static修饰的成员只实例化一次,而string类型每次赋值都会重新创建一个实例,那么用static修饰string呢?...

    string 类型每次实例化都会重新创建一个实例: 解释:string 类型重载了运算符 "=" ,每次 "=" 操作都是一次 "new". ...

  6. ​iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景.

    2019独角兽企业重金招聘Python工程师标准>>> 主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机制分两块,(1)首先在 ...

  7. docker 主进程 日志_[docker]从一个实例,一窥docker进程管理

    在Docker中,进程管理的基础是Linux内核的PID命名空间技术.在不同的PID命名空间下,可以有相同的PID. Linux内核为所有的PID命名空间维护了一个树状的数据结构,最顶层是系统初始化时 ...

  8. 让Java程序只运行一个实例

    一个程序可以在内存里面存在多个运行实例,比如,你可以打开多个微软的Word程序.但是,有些时候我们需要控制程序运行的实例只有一个,也就是说,该程序同一时刻在内存里面运行的只有一个实例.这样当这个程序在 ...

  9. php单例模式的实例,PHP的单例模式的一个实例_php

    这篇文章对于php单例模式的解释并不一定完善!只是举一个实例而已,目的是让我自己通过一个实例可以加深对单例模式的理解!在此,仅供参考! 单例:可以简单的理解是通过一个类,只能实例化单个对象,不能实例化 ...

  10. 从一个实例,一窥docker进程管理

    在Docker中,进程管理的基础是Linux内核的PID命名空间技术.在不同的PID命名空间下,可以有相同的PID. Linux内核为所有的PID命名空间维护了一个树状的数据结构,最顶层是系统初始化时 ...

最新文章

  1. 图灵奖得主Hamming对于少数人获得重大成果原因的思考,送给此刻克服迷惘坚持前行的你...
  2. python数学知识_数学知识回顾01
  3. 哈佛博士生经验分享:10种方法让你在读博阶段更加轻松愉快
  4. 服务器出生点配置文件,服务器设置出生点
  5. HIBERNATE与 MYBATIS的对比
  6. C# 类型参数的约束
  7. STM32——HAL版——串口发送字符串函数
  8. macbook 安装iperf_三分钟学会iperf3的使用
  9. insight face数据打包(一):LFW
  10. python快捷键失灵
  11. linux的dd命令与cp,dd命令中seek和skip的用法-Linux下挂载 windows 共享的命令-学习history命令的使用方法_169IT.COM...
  12. java中try-catch-finally的使用
  13. 【37期】请你详细说说类加载流程,类加载机制及自定义类加载器
  14. C语言学习笔记—链表(四)链表的删除
  15. mysql identity sqlserver_mysql和sqlserver的区别
  16. 三次样条插值(Spline插值)
  17. 杰里之AD140录音编码接口【篇】
  18. Why Memory Barriers中文翻译(下)
  19. Java零基础学习全套视频笔记
  20. linux就该这么学pdf+下载链接

热门文章

  1. 白板推导系列Pytorch-隐马尔可夫模型(HMM)
  2. C# where()筛选方法
  3. 每周荐书:JVM、Nginx、小程序(评论送书)
  4. 敏捷无敌(13)之兵不厌诈
  5. 07堆排序 python
  6. 1.1 文本表示——离散形式表示
  7. 来了!最详细2019实习生退税完全攻略(适用于所有实习过的同学)
  8. Python中的闭包与参数引用域
  9. Scala: 简介和安装
  10. python 调用gpu算力_教你免费使用百度云GPU算力提交深度学习任务