ManualResetEvent:

  通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源。

  • Set() : 用于向 ManualResetEvent 发送信号,使其取消阻塞状态(唤醒进程)或者开始阻塞进程,这基于 ManualResetEvent 的初始状态。
  • ReSet() : 将 ManualResetEvent 的状态重置至初始状态(即使用 Set() 方法之前的状态)。
  • WaitOne() : 使 ManualResetEvent 进入阻塞状态,开始等待唤醒信号。如果有信号,则不会阻塞,直接通过。
  • 信号 :  new ManualResetEvent(bool arg) ,arg参数就是信号状态,假如为false,则表示当前无信号阻塞线程;如果为true,则有信号不阻塞。
 static ManualResetEvent _munual = new ManualResetEvent(false);
static void Main(string[] args)
{
_munual.Reset();
for (int i = ; i <= ; i++)
{
Thread th = new Thread(() =>
{
while (true)
{
_munual.WaitOne();
Print();
Thread.Sleep();
}
});
th.IsBackground = true;
th.Name = "线程" + i;
th.Start();
} while (true)
{
Thread.Sleep();
Console.WriteLine($"主线程设置信号量");
_munual.Set();
Thread.Sleep();
_munual.Reset();
}
} static void Print()
{
Console.WriteLine($"{Thread.CurrentThread.Name}::{DateTime.Now.ToString("hh:mm:ss-fff")}");
}

ManualResetEvent示例

AutoResetEvent:

  与ManualResetEvent功能类似。

   AutoResetEvent(bool initialState):构造函数,用一个指示是否将初始状态设置为终止的布尔值初始化该类的新实例。
        false:无信号,子线程的WaitOne方法不会被自动调用
        true:有信号,子线程的WaitOne方法会被自动调用
   Reset ():将事件状态设置为非终止状态,导致线程阻止;如果该操作成功,则返回true;否则,返回false。
   Set ():将事件状态设置为终止状态,允许一个或多个等待线程继续;如果该操作成功,则返回true;否则,返回false。
   WaitOne(): 阻止当前线程,直到收到信号。
   WaitOne(TimeSpan, Boolean) :阻止当前线程,直到当前实例收到信号,使用 TimeSpan 度量时间间隔并指定是否在等待之前退出同步域。   
     WaitAll():等待全部信号。
 static void Main(string[] args)
{
int current = ;
List <AutoResetEvent> events = new List<AutoResetEvent>();
for (int taskid = ; taskid < ; taskid++)
{
Task.Factory.StartNew(() =>
{
int curr = Interlocked.Increment(ref current);
AutoResetEvent evt = new AutoResetEvent(false);
events.Add(evt);
Console.WriteLine($"Task[{curr}]: working");
Thread.Sleep(current * );
Console.WriteLine($"Task[{curr}]: exit");
evt.Set();
});
}
Console.WriteLine($"Main wait");
AutoResetEvent.WaitAll(events.ToArray());
Console.WriteLine($"All works are done,Main exit");
Console.ReadKey();
}

AutoResetEvent示例

两只比较:

AutoResetEvent在一个线程Wait通过后,会自动设置为有信号状态重新阻塞线程。而ManualResetEvent要调用Reset方法重置,否则将一直允许后续其他线程通过。

https://blog.csdn.net/ma_jiang/article/details/78628988

https://www.cnblogs.com/zhangweizhong/p/6628442.html

[.net 多线程]AutoResetEvent, ManualResetEvent的更多相关文章

  1. 多线程AutoResetEvent

    我们在线程编程的时候往往会涉及到线程的通信,通过信号的接受来进行线程是否阻塞的操作. AutoResetEvent 允许线程通过发信号互相通信.通常,此通信涉及线程需要独占访问的资源. AutoRes ...

  2. C#多线程之 ManualResetEvent和AutoResetEvent

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

  3. C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent

    看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...

  4. AutoResetEvent ManualResetEvent WaitOne使用注意事项

    公司还用这些老家伙没办法,用了几次这俩.每次用都要重新翻一下A片. 好好的A片楞是翻译成了禅经.把这东西弄成个玄学.微软也是吃枣药丸.参考了@风中灵药的blog.写的牛逼. 还有一些公司用到的风中灵药 ...

  5. 多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent

    本章主要介绍下基于内核模式构造的线程同步方式,事件,信号量. 阅读目录: 理论 WaitHandle AutoResetEvent ManualResetEvent 总结 理论 Windows的线程同 ...

  6. 线程同步(AutoResetEvent与ManualResetEvent)

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

  7. 【深度好文】多线程之WaitHandle-->派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent

    AutoResetEvent/ManualResetEvent 都是继承自 EventWaitHandle ,EventWaitHandle继承自WaitHandle. 在讨论这个问题之前,我们先了解 ...

  8. [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)

    [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...

  9. 细说C#多线程那些事 - 线程同步和多线程优先级

    上个文章分享了一些多线程的一些基础的知识,今天我们继续学习. 一.Task类 上次我们说了线程池,线程池的QueueUserWorkItem()方法发起一次异步的线程执行很简单 但是该方法最大的问题是 ...

随机推荐

  1. Redis官方文档》持久化

    原文链接 译者:Alexandar Mahone 这篇文章从技术层面描述了Redis持久化,建议所有读者阅读.如果希望更多了解Redis持久化和持久性保障,建议阅读Redis持久化揭秘. Redis ...

  2. 【转】关于一个Jmeter interface testing的实例

    目标:测试某个保险系统的费率接口 准备:a 请求方式:Http b 接口地址://10.1.1.223:9090/rulesEngine/executeRateRule.do Jmeter 设置: a ...

  3. atorg.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:557)

    错误原因: 你当前开发环境中{Hadoop_HOME}\bin\hadoop.dll 文件和你当前的hadoop版本不匹配.  解决方案: 网络下载相应版本的hadoop.dll,并将该文件放入c:\ ...

  4. java - 只输出中文, 包含中文标点符号

    在 Java 中直接使用Unicode 转码时会按照UTF-16LE 的方式拆分,并加上 BOM. 如果采用 UTF-16 拆分,在 Java 中默认采用带有 BOM 的 UTF-16BE 拆分. S ...

  5. CodeIgniter框架隐藏index.php

    问题描述:使用CodeIgniter框架做项目时,在启用REWRITE的伪静态功能的时候,首页可以访问,但是访问其它页面的时候,就提示:“No input file specified.” 原因在于使 ...

  6. JAVA中跨平台分隔符

    在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常. 比如说要在temp目录下建立一个te ...

  7. wince驱动开发入门

    因为课题前期调研没做好,用的CPU板卡和数据采集卡来自两个部门.加上买的是裸板,自己定制的OS,技术支持不爱搭理.所以给的AI板卡的驱动一直装不上,自己在郁闷中寻找答案,就扎进了wince驱动的知识库 ...

  8. windows 共存多个位数不同的jdk时,eclipse的报错对应措施

    1. 判断当前jdk的位数 # java -version java version "1.6.0_26" Java(TM) SE Runtime Environment (bui ...

  9. EF的左连接查询

    在EF中,当在dbset使用join关联多表查询时,连接查询的表如果没有建立相应的外键关系时,EF生成的SQL语句是inner join(内联),对于inner join,有所了解的同学都知道,很多时 ...

  10. 【bzoj1025】[SCOI2009]游戏

    1025: [SCOI2009]游戏 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1987  Solved: 1289[Submit][Status] ...