在公司的代码里面看到这两个类的使用了,第一次去msdn上的时候,看的一头雾水(关键是没有找对方法)

http://www.cnblogs.com/qingyun163/archive/2013/01/05/2846633.html      这篇博客应该会有些帮助的

这次看的比较仔细,懂得看一个类的时候,可以去找它的父类。

发现AutoResetEvent 和ManualResetEvent 全部都继承自EventWaitHandle类

EventWaitHandle中有介绍EventResetMode 这个枚举类型  

    // 摘要:
// 指示在接收信号后是自动重置 System.Threading.EventWaitHandle 还是手动重置。
[ComVisible(false)]
public enum EventResetMode
{
// 摘要:
// 当终止时,System.Threading.EventWaitHandle 在释放一个线程后自动重置。如果没有等待的线程,System.Threading.EventWaitHandle
// 将保持终止状态直到一个线程阻止,并在释放此线程后重置。
AutoReset = ,
//
// 摘要:
// 当终止时,System.Threading.EventWaitHandle 释放所有等待的线程,并在手动重置前保持终止状态。
ManualReset = ,
}
 EventResetMode 枚举的代码示例

using System;
using System.Threading; namespace MyEventResetMode
{
class Program
{
/// <summary>
/// EventWaitHandle变量 可以赋值AutoReset和ManualReset
/// </summary>
private static EventWaitHandle ewh; /// <summary>
/// 线程的计数器 在进入线程后加1 释放线程后减1
/// </summary>
private static long threadCount = ; /// <summary>
/// 让主线程阻塞的 EventWaitHandle 到所有开辟出来的线程全部被释放
/// </summary>
private static EventWaitHandle clearCount = new EventWaitHandle(false, EventResetMode.AutoReset); static void Main(string[] args)
{
//创建一个AutoReset类型的EventWaitHandle
ewh = new EventWaitHandle(false, EventResetMode.AutoReset); //创建5个线程,将i作为参数传递,以识别不同的线程
for (int i = ; i <= ; i++)
{
Thread t = new Thread(
new ParameterizedThreadStart(ThreadProc)
);
t.Start(i);
Thread.Sleep();//确保线程是有先后顺序的 方便后面判断AutoReset是否随机释放单个线程
} while (Interlocked.Read(ref threadCount) < )//等待所有的线程启动并阻塞
{
Thread.Sleep();
} Console.WriteLine(); while (Interlocked.Read(ref threadCount) > )//逐个释放ewh阻塞的线程
{
Console.WriteLine("Press ENTER to release a waiting thread.");
Console.ReadLine(); WaitHandle.SignalAndWait(ewh, clearCount);//向一个 WaitHandle 发出信号并等待另一个。 相当于下面两个语句
/*
ewh.Set();//收到信号之后,随机释放一个被它阻塞的线程,其它的保持阻塞
clearCount.WaitOne();//阻塞
*/
//ewh是要发出信号的WaitHandle, ewh收到信号之后,释放单个线程,然后再自动阻塞
//clearCount是要等待的WaitHandle clearCount在此等待 相当于调用了clearCount.WaitOne(); }
Console.WriteLine(); //创建一个ManualReset类型的EventWaitHandle
ewh = new EventWaitHandle(false, EventResetMode.ManualReset); //创建5个线程,将i作为参数传递,以识别不同的线程
for (int i = ; i <= ; i++)
{
Thread t = new Thread(
new ParameterizedThreadStart(ThreadProc)
);
t.Start(i);
} while (Interlocked.Read(ref threadCount) < )//等待所有线程启动并阻塞
{
Thread.Sleep();
} Console.WriteLine("Press ENTER to release the waiting threads.");
Console.ReadLine();
ewh.Set(); //一次释放所有被它阻塞的线程 Console.Read();
} public static void ThreadProc(object data)
{
int index = (int)data; Interlocked.Increment(ref threadCount);//计数增加
Console.WriteLine("Thread {0} blocks.", data);
ewh.WaitOne();//等待ewh发出信号 Console.WriteLine("Thread {0} exits.", data);
Interlocked.Decrement(ref threadCount);//计数减少 clearCount.Set();//释放主线程一次
}
}
}

EventWaitHandle需要注意的是,如果初始设置为false,那么就会阻塞线程。

如果初始为true,AutoReset会先释放掉等待线程中的任意一个,其他的线程仍保持阻塞。如果初始为true,ManualReset不会阻塞,直接释放掉所有的线程。

关于AutoResetEvent 和ManualResetEvent的更多相关文章

  1. C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent

    最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...

  2. 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析

    AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...

  3. 个人对AutoResetEvent和ManualResetEvent的理解(转载)

    仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方 ...

  4. AutoResetEvent和ManualResetEvent理解 z

    AutoResetEvent和ManualResetEvent用于多线程之间代码执行顺序的控制,它们继承自WaitHandle,API相同,但在使用中还是有区别的. 每次使用时虽然理解了,但由于没有去 ...

  5. C#AutoResetEvent和ManualResetEvent的区别

    一:终止状态和非终止状态 首先说说线程的终止状态和非终止状态.AutoResetEvent和ManualResetEvent的构造函数中,都有bool变量来指明线程的终止状态和非终止状态.true表示 ...

  6. 线程同步(AutoResetEvent与ManualResetEvent)

    前言 在我们编写多线程程序时,会遇到这样一个问题:在一个线程处理的过程中,需要等待另一个线程处理的结果才能继续往下执行.比如:有两个线程,一个用来接收Socket数据,另一个用来处理Socket数据, ...

  7. AutoResetEvent与ManualResetEvent区别

    本文来自:http://www.360doc.com/content/10/1126/10/3267996_72536817.shtml 在.Net多线程编程中,AutoResetEvent和Manu ...

  8. WaitHandle、AutoResetEvent、ManualResetEvent

    多线程中的锁系统(三)-WaitHandle.AutoResetEvent.ManualResetEvent 介绍 本章主要说下基于内核模式构造的线程同步方式,事件,信号量. 目录 一:理论 二:Wa ...

  9. 对比AutoResetEvent和ManualResetEvent

    ManualResetEvent和AutoResetEvent 比较 ManualResetEvent和AutoResetEvent都继承自EventWaitHandler,它们的唯一区别就在于父类 ...

  10. c# AutoResetEvent和ManualResetEvent

    网上有很多AutoResetEvent和ManualResetEvent的详细介绍,在这里不做过多详细的解释,写下自己的一点心得留作备忘. AutoResetEvent和ManualResetEven ...

随机推荐

  1. sencha touch 入门系列 (六)sencha touch运行及代码解析(下)

    接着上一讲,通过index.html里development.js对app.json里js资源文件的解析,app.js便被index.html引入了, app.js是整个项目的程序入口,在项目完成时使 ...

  2. apt-get install的默认安装路径

    apt-get 命令 sudo apt-get update sudo apt-get install tree sudo apt-get -y install tree //跳过系统提示,直接安装. ...

  3. Egret5.2.2 微信小游戏行的示例排行榜

    Egret5.2.2版本发布微信小游戏后,在开放数据域有一个默认排行榜.这个文件夹代码+图大小就22kb. 排行榜的效果就是示范用的,很丑...带翻页. 代码如下,基本就是使用canvas渲染了一个排 ...

  4. iOS - 获取状态栏和导航栏尺寸(宽度和高度)

    iPhone开发当中,有时需要获取状态栏和导航栏高度.宽度信息,方便布局其他控件.下面介绍一下如何获取这些信息: // 状态栏(statusbar) CGRect rectStatus = [[UIA ...

  5. SMGP3.0协议的概念知识

    该项目主页在https://code.google.com/archive/p/smgp/,可以使用VPN进去看看,该项目是开源的,根据SMGP3.0协议写的API,我们要用的话直接调用就好了,这里主 ...

  6. Hadoop集群搭建文档

      环境: Win7系统装虚拟机虚拟机VMware-workstation-full-9.0.0-812388.exe Linux系统Ubuntu12.0.4 JDK                j ...

  7. 封装自己的getClassName函数

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. docker swarm+register-web+shipyard搭建

    1.swarm安装 swarm安装有很多种服务注册的方式,token.etcd.zookeeper,本文主要以swarm默认的token方式进行安装.因为最新的docker已经集成了swarm,所以从 ...

  9. Linux下安装和卸载jdk步骤详述

    安装jdk 1.下载jdk8 jdk下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-21331 ...

  10. 170511、Spring IOC和AOP 原理彻底搞懂

    Spring提供了很多轻量级应用开发实践的工具集合,这些工具集以接口.抽象类.或工具类的形式存在于Spring中.通过使用这些工具集,可以实现应用程序与各种开源技术及框架间的友好整合.比如有关jdbc ...