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

kevinGao 2021-08-09 原文


一个实例明白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 下次就不能使用. 这就是他们的区别。

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

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

发表于
2011-11-29 16:32 
Kevin Gao 
阅读(263
评论(0
编辑 
收藏 
举报

 

版权声明:本文为kevinGao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/kevinGao/archive/2011/11/29/2270745.html

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

  1. UML系列05之 基本流程图 – 如果天空不死

    UML系列05之 基本流程图   概要 软件的基本流程图是我们在学习编程时的必修课,它很简单,却很实用。需要说 […]...

  2. FastDFS — 分布式文件系统

    目录 FastDFS 什么是分布式文件系统 为什么会有分布文件系统 存在问题 解决办法 示例图 好处 主流的分 […]...

  3. 安装SHARP MX-3618NC PCL6打印机驱动程序 – 耸立的青竹

    安装SHARP MX-3618NC PCL6打印机驱动程序 第一步,  打开MX-CR3_PCL_PS_130 […]...

  4. Win8系统搜索不到无线信号该怎么办? – ghost_xp

    Win8系统搜索不到无线信号该怎么办? 最近朋友问我他电脑安装了预装Win8中文版系统出现了一点小问题,无线设 […]...

  5. DAX/PowerBI系列 – 关于时间系列 – 时间相关数值比较 – 用非自带函数

    DAX/PowerBI系列 – 关于时间系列 – 时间相关数值比较 – 用 […]...

  6. win10-wifi无线共享自动关闭解决 – 男主杰

    win10-wifi无线共享自动关闭解决    把√去掉  ...

  7. 在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好的管理异常) – zyb2016

    在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好 […]...

  8. opencv 学习方法 – 夏鸥易

    opencv 学习方法 1、 学习方法: http://www.opencv.org.cn/forum.php […]...

随机推荐

  1. 阿里云linux主机安装jdk、tomcat

    1、首先要查看服务器的系统版本,是32位还是64位 #cat /etc/issue CentOS releas […]...

  2. JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇

    JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇 作为一个使用Java语言开发的程序员,我们都知道 […]...

  3. nxlog4go 按天或按文件大小分割日志

    Building a new rotate file writer: rfw := l4g.NewRotate […]...

  4. FileProvider的使用及应用更新时提示:解析包出错、失败等问题

    FileProvider的使用及应用更新时提示:解析包出错、失败等问题 Android 7.0以上的版本更新采 […]...

  5. 人工智能的定义与探讨

    零 序 0-1 自学进度 数学 计算机基础 ML算法 工程实践 微积分 Python基础 K-NN 基于K-N […]...

  6. v-bind v-on 缩写

    Vue.js 为两个最为常用的指令提供了特别的缩写:  ...

  7. FPGA最小系统设计

    以EP4CE6E22I7为例,设计FPGA最小系统。 程序存储设计 一般使用EPCS4I8N: FPGA_DA […]...

  8. 解决FlashFXP登录FTP时候卡在MLSD

    前个星期开始发现FlashFXP总是在登录FTP的时候卡在MLSD,以前一直都可以的,我也没修改过FlashF […]...

展开目录

目录导航