一、两者区别

1.ManualResetEvent 调用一次Set()后将允许恢复所有被阻塞线程。需手动在调用WaitOne()之后调用Reset()重置信号量状态为非终止,然后再次调用WaitOne()的时候才能继续阻塞线程,反之则不阻塞

2.AutoResetEvent,调用一次Set()只能继续被阻塞的一个线程,多次调用Set()才行,但不需手动调用Reset();再次调用WaitOne()的时候又能阻塞线程,也是和前者的区别

3.两者单个实例均可阻塞一个或多个线程,在多个线程中调用 主线程 创建的 两者单个实例.WaitOne(),前提是两者实例必须是非终止状态

4.两者实例化构造参数解释

public AutoResetEvent(bool initialState);

true:设置终止状态。相当于调用了Set(),即首次不会被WaitOne()阻塞,下次执行WaitOne()才会被阻塞

false:设置非终止状态。遇到WaitOne()立即阻塞所在的一个或多个线程

5. 两者都只会阻塞WaitOne()所在的线程,WaitOne()可被多个线程调用

二、在哪里创建信号量实例?

一般情况下在工作线程中创建信号量的实例,在其他线程中使用,然后再在工作线程中调用Set(),可以是在非主线程创建实例

三、代码示例

   public  class Program
    {

        //1.AutoResetEvent,调用一次Set()只能继续一个阻塞线程
//2.AutoResetEvent调用Set()后自动Reset()
static void Main(string[] args)
{ Thread t = null;
AutoResetEvent Event = new AutoResetEvent(false); for (int i = ; i < ; i++)
{
t = new Thread(() =>
{ while (true)
{
//阻塞当前线程
Event.WaitOne();
Console.WriteLine("我是线程:" + Thread.CurrentThread.Name);
Thread.Sleep();
} });
t.Name = i + "";
t.Start();
}
//5秒后允许一个等待的线程继续。当前允许的是线程1
Thread.Sleep();
Event.Set(); //5秒后允许一个等待的线程继续。当前允许的是线程2
Thread.Sleep();
Event.Set(); //PS:如果使用AutoResetEvent的WaitOne()将5个线程阻塞,则需要调用5次Set()才能恢复5;如果再次阻塞时,不需要手动调用Reset();
Console.ReadLine(); } //1.ManualResetEvent,调用一次Set()允许继续全部阻塞线程,这是和AutoResetEvent的区别
//2.ManualResetEvent调用Set()后需要手动Reset(),将信号 设置为非终止状态,只有非终止状态线程中调用WaitOne()才能导所在的致线程阻止。
static void Main2(string[] args)
{ Thread t = null;
//初始化非终止状态,WaitOne()可以直接阻塞所在的线程
ManualResetEvent Event = new ManualResetEvent(false); for (int i = ; i < ; i++)
{
t = new Thread(() =>
{ while (true)
{
//阻塞当前线程
Event.WaitOne();
Console.WriteLine("我是线程:" + Thread.CurrentThread.Name);
Event.ReSet();
Thread.Sleep();
} });
t.Name = i + "";
t.Start();
}
//5秒后允许所有阻塞的线程继续。
Thread.Sleep();
Event.Set(); //PS:如果使用ManualResetEvent将5个线程阻塞,则需要调用1次Set(),将允许所有阻塞的线程继续执行;如果再次阻塞时,则需要手动调用Reset();
Console.ReadLine(); }
}

备注:信号量

C# ManualResetEvent和AutoResetEvent 使用笔记的更多相关文章

  1. 【C#】【Thread】ManualResetEvent和AutoResetEvent区别

    ManualResetEvent和AutoResetEvent主要用于线程之间同步问题. 主要使用方法有Set();Reset();WaitOne(); Set():将事件状态设置为终止状态,允许一个 ...

  2. ManualResetEvent和AutoResetEvent的区别实例

    ManualResetEvent和AutoResetEvent的作用可以理解为在线程执行中插入停顿点flag终止程序运行,然后通过设置flag的状态来使得程序继续运行. 两者的区别是:ManualRe ...

  3. C#多线程之二:ManualResetEvent和AutoResetEvent

    初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...

  4. ManualResetEvent和AutoResetEvent的区别

    在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...

  5. 对ManualResetEvent和AutoResetEvent的巩固练习

    在多线程编程中,最常用到的就是线程同步问题,前段时间开发地址采集服务器,需要携带经纬度到MapAbc中采集后,返回地址,才可以进行下一条经纬度的采集,因为队列处理和解析不是同一个线程,并且是解析经纬度 ...

  6. 211. Orchard学习 二 2、ManualResetEvent 与 AutoResetEvent

    一.Orchard里异步请求处理线程队列的控制 Orchard的Orchard.WarmupStarter模块,为HttpApplication.BeginRequest时间附加了一个异步处理事件:B ...

  7. C# 多线程学习系列四之ThreadPool取消、超时子线程操作以及ManualResetEvent和AutoResetEvent信号量的使用

    1.简介 虽然ThreadPool.Thread能开启子线程将一些任务交给子线程去承担,但是很多时候,因为某种原因,比如子线程发生异常.或者子线程的业务逻辑不符合我们的预期,那么这个时候我们必须关闭它 ...

  8. C#多线程之 ManualResetEvent和AutoResetEvent

    初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...

  9. ManualResetEvent和AutoResetEvent的区别,分享来的

    在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...

随机推荐

  1. Perl 的面向对象编程

    转自 http://net.pku.edu.cn/~yhf/tutorial/perl/perl_13.html 拓展阅读 http://bbs.chinaunix.net/forum.php?mod ...

  2. asp.net mvc 外网获取不到port问题解决

    var IPandPort = Request.ServerVariables["HTTP_HOST"];

  3. GraphX的三大图算法

    1. PageRank http://blog.csdn.net/hguisu/article/details/7996185 2. Connected Components 3. Triangle ...

  4. Hive 一些便捷小查询

    show create table 表名; -- 可以查看表的DDL语句 describe 表名; -- 查看表的字段信息 explain dependency select count(1) fro ...

  5. 【BZOJ-1833】count数字计数 数位DP

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2494  Solved: 1101[Submit][ ...

  6. 【bzoj1001】 BeiJing2006—狼抓兔子

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001 (题目链接) 题意 给出一张图,求最小割. Solution1 最小割=最大流,所以直接Din ...

  7. codeforces 723A : The New Year: Meeting Friends

    Description There are three friend living on the straight line Ox in Lineland. The first friend live ...

  8. Java多线程实践

    1.实现Runnable接口 import java.util.Random; public class PrintTask implements Runnable{ private final in ...

  9. C++ 之 Direct and Copy Forms of Initialization

    Extraction from C++ Primer 5th. Editioin 3.2.1 C++ has several different forms of initialization, we ...

  10. Windows系统:桌面,开始菜单和工具栏都不见了

    win7桌面,开始菜单和工具栏都不见了 ctrl+alt+del 打开任务管理器 然后文件-运行 ---  输入框里输入  explorer.exe 其实就是打开系统文件夹下的(大约是‘windows ...