在公司的代码里面看到这两个类的使用了,第一次去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. JavaIO简单代码实例

    最近又复习了下JavaIO写了些实例代码都很简单但是能体现大部分方法的用法. IO流实现文件的拷贝   几种不同的方法: package com.wxisme.TestIO; import java. ...

  2. 转移wordpress到另一台主机

    做项目的代码是两个人,我想把另一个小伙伴做的转移到自己的linux系统上(主要是linux下一片空白,从头做太浪费时间了) 这个过程其实也可以用来类比从本地到服务器的过程(可能略有不同,真上线的时候会 ...

  3. Egret3D初步学习笔记三 (角色使用)

    一 Unity中编辑角色 仍然使用unity4.7.1_Egret3D_Dll.unitypackage. 里面含有一个角色. 二 查看人物的动画 选中lingtong 属性面板里有个Animator ...

  4. c# Winform间的页面传值

    Form2 public partial class Form2 : Form { public string str; public Form2() { InitializeComponent(); ...

  5. applicationContext.xml的文件位置就可以有两种默认实现

    ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息.因为它实现了ServletContextListener这个接口,在web ...

  6. log4j配置输出到多个日志文件(转)

    參考资料:http://logging.apache.org/log4j/1.2/manual.html 通常我们项目里,有一些重要的日志想单独的输出到指定的文件,而不是全总输出到系统的日志文件中.那 ...

  7. SpringBoot实现热加载方式

    一. spring-boot-devtools方式1.在pom.xml中加入以下代码: 2.标识红线的地方加上 3.在设置里面加上自动编译 4.shift+ctrl+alt+/ 这样就可以了! 二.s ...

  8. idea 之git使用详细教程

    安装 选择VersionControl下的Git,依据下图进行git配置   使用 荡项目 从VCS菜单选择checkout from version control-->git   更新项目 ...

  9. nginx 上php不可写解决方法

    在php.ini中设置的session.save_path会被php-fpm.conf中覆盖 打开php-fpm.conf文件找到php_value['session.save_apth'] 这里的/ ...

  10. __devexit_p的功能

    看驱动的时候,时常会有如下代码: .remove = __devexit_p(XX_exit), 这里的__devexit_p有什么作用呢? 我在include/linux/init.h中找到了它的定 ...