ManualResetEvent类

  • 1.事件初始状态设为false,task线程在第一个WaitOne()处阻塞。
  • 2.manualResetEvent.Set()事件状态设为true,task线程在每一个WaitOne()处都不阻塞。
  • 3.manualResetEvent调用Set()再调用Reset(),task线程在第一个WaitOne()处阻塞。
  • 4.manualResetEvent.Set()事件状态设为true,task线程在第一个WaitOne()处阻塞然后被释放。
  • 5.三个线程异步执行,set()释放所有线程


#作用

一个线程通知其他一个或多个线程正在发送的事件。

ManualResetEvent manualResetEvent = new ManualResetEvent(false);

参数表示调用WaitOne()方法的线程是继续执行(true)还是阻塞(false)。

WaitOne():调用WaitOne()方法的线程会阻塞,等待主控线程的manualResetEvent.Set()信号。

Set():将事件状态设为true,调用WaitOne()的线程继续执行。
Reset():将事件状态设为false,调用WaitOne()的线程阻塞。

Set() Reset():只针对WaitOne()方法,不影响WaitOne()方法之前的程序执行。若没有信号,调用WaitOne()方法的线程一直阻塞。

1.事件初始状态设为false,task线程在第一个WaitOne()处阻塞。

using System;
using System.Threading;
using System.Threading.Tasks;
namespace ManualResetEvent测试
{class Program{static ManualResetEvent manualResetEvent = new ManualResetEvent(false);static void Main(string[] args){//Task线程和主线程同时执行Task task = Task.Factory.StartNew(() =>{GetDataFromServer(1);});Console.ReadLine();}static void GetDataFromServer(int serverNumber){Console.WriteLine("I get first data from server" + serverNumber);manualResetEvent.WaitOne();Console.WriteLine("I get second data from server" + serverNumber);Thread.Sleep(TimeSpan.FromSeconds(2));Console.WriteLine("I get third data from server" + serverNumber);manualResetEvent.WaitOne();Console.WriteLine("All the data collected from server" + serverNumber);}}
}

输出:
I get first data from server1

2.manualResetEvent.Set()事件状态设为true,task线程在每一个WaitOne()处都不阻塞。

namespace ManualResetEvent测试
{class Program{static ManualResetEvent manualResetEvent = new ManualResetEvent(false);static void Main(string[] args){//两个Task线程和主线程同时执行Task task = Task.Factory.StartNew(() =>{GetDataFromServer(1);});//主线程执行,将信号set为true,调用WaitOne()的线程被释放manualResetEvent.Set();Console.ReadLine();}static void GetDataFromServer(int serverNumber){Console.WriteLine("I get first data from server" + serverNumber);manualResetEvent.WaitOne();Console.WriteLine("I get second data from server" + serverNumber);Thread.Sleep(TimeSpan.FromSeconds(2));Console.WriteLine("I get third data from server" + serverNumber);manualResetEvent.WaitOne();Console.WriteLine("All the data collected from server" + serverNumber);}}
}

输出:
I get first data from server1
I get second data from server1
I get third data from server1
All the data collected from server1

3.manualResetEvent调用Set()再调用Reset(),task线程在第一个WaitOne()处阻塞。

namespace ManualResetEvent测试
{class Program{static ManualResetEvent manualResetEvent = new ManualResetEvent(false);static void Main(string[] args){//两个Task线程和主线程同时执行Task task = Task.Factory.StartNew(() =>{GetDataFromServer(1);});//主线程执行,调用WaitOne()的线程被释放再马上阻塞manualResetEvent.Set();manualResetEvent.Reset();Console.ReadLine();}static void GetDataFromServer(int serverNumber){Console.WriteLine("I get first data from server" + serverNumber);manualResetEvent.WaitOne();Console.WriteLine("I get second data from server" + serverNumber);Thread.Sleep(TimeSpan.FromSeconds(2));Console.WriteLine("I get third data from server" + serverNumber);manualResetEvent.WaitOne();Console.WriteLine("All the data collected from server" + serverNumber);}}
}

输出:
I get first data from server1

4.manualResetEvent.Set()事件状态设为true,task线程在第一个WaitOne()处阻塞然后被释放。

namespace ManualResetEvent测试
{class Program{static ManualResetEvent manualResetEvent = new ManualResetEvent(false);static void Main(string[] args){//Task线程和主线程同时执行Task task = Task.Factory.StartNew(() =>{GetDataFromServer(1);});setEvent.Set();manualResetEvent.Reset();Thread.Sleep(TimeSpan.FromSeconds(8));manualResetEvent.Set();Console.ReadLine();}static void GetDataFromServer(int serverNumber){Console.WriteLine("I get first data from server" + serverNumber);manualResetEvent.WaitOne();Console.WriteLine("I get second data from server" + serverNumber);Thread.Sleep(TimeSpan.FromSeconds(2));Console.WriteLine("I get third data from server" + serverNumber);manualResetEvent.WaitOne();Console.WriteLine("All the data collected from server" + serverNumber);}}
}

输出:
先输出 I get first data from server1
然后task被阻塞,8秒后task获得Set()信号,再输出 I get second data from server1
再间隔2秒输出,第二个WaitOne()不会被阻塞
I get third data from server1
All the data collected from server1

5.三个线程异步执行,set()释放所有线程

namespace ManualResetEvent测试
{class Program{static ManualResetEvent manualResetEvent = new ManualResetEvent(false);static void Main(string[] args){//两个Task线程和主线程同时执行Task task = Task.Factory.StartNew(() =>{GetDataFromServer(1);});Task.Factory.StartNew(() =>{GetDataFromServer(2);});manualResetEvent.Set();manualResetEvent.Reset();Thread.Sleep(TimeSpan.FromSeconds(8));manualResetEvent.Set();Console.ReadLine();}static void GetDataFromServer(int serverNumber){Console.WriteLine("I get first data from server" + serverNumber);manualResetEvent.WaitOne();Console.WriteLine("I get second data from server" + serverNumber);Thread.Sleep(TimeSpan.FromSeconds(2));Console.WriteLine("I get third data from server" + serverNumber);manualResetEvent.WaitOne();Console.WriteLine("All the data collected from server" + serverNumber);}}
}

输出:
先输出
I get first data from server1
I get first data from server2
然后task被阻塞,8秒后task获得Set()信号,再输出
I get second data from server2
I get second data from server1
再间隔2秒输出,第二个WaitOne()不会被阻塞
I get third data from server2
All the data collected from server2
I get third data from server1
All the data collected from server1

ManualResetEvent类的用法相关推荐

  1. python 包用法_Python 基础教程之包和类的用法

    Python 基础教程之包和类的用法 这篇文章主要介绍了 Python 基础教程之包和类的用法的相关资料, 需要的朋友可以参考下 Python 是一种面向对象.解释型计算机程序设计语言,由 Guido ...

  2. 【ES6】JS类的用法class

    [ES6]JS类的用法class 一.概述 二.构造函数constructor 三.静态方法与静态变量 查看更多ES6教学文章: 参考文献 引言:由于JS之前一直没有特有的class来定义类的语法,E ...

  3. string类具体用法

    string类具体用法 二话不说上代码 #include<string> #include<iostream> #include<algorithm> using ...

  4. php分析图片水印,PHP开发的文字水印,缩略图,图片水印实现类与用法示例

    本文实例讲述了PHP开发的文字水印,缩略图,图片水印实现类与用法.分享给大家供大家参考,具体如下: 1.实现类ImageToTest.class.php参考代码 class ImageToTest { ...

  5. Android -------GestureDetector类的用法

    GestureDetector类的用法 2010-10-18 14:39:02|  分类: android|字号 订阅 GestureDetector类定义了许多触摸事件.包括     1.boole ...

  6. Handle类的用法

    android中Handle类的用法 当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无 ...

  7. C# “Thread类Suspend()与Resume()已过时” 解决方法(利用ManualResetEvent类)

    C# "Thread类Suspend()与Resume()已过时" 解决方法(利用ManualResetEvent类) 参考文章: (1)C# "Thread类Suspe ...

  8. 【Kotlin】Kotlin enum 枚举类 ( 常用用法 | 初始化成员变量 | 实现抽象方法 | 实现接口 | 获取名称和位置索引 | 调用枚举常量方法 )

    文章目录 I . 枚举类常用用法 II . 枚举类初始化 III. 枚举类匿名类 IV . 枚举类实现接口 V . 获取枚举常量名称和位置索引 VI . 获取枚举常量的成员变量 VII . 调用枚举常 ...

  9. jsonutil java_Java实现的JSONUtil工具类与用法示例

    本文实例讲述了Java实现的JSONUtil工具类与用法.分享给大家供大家参考,具体如下: import java.util.HashMap; import java.util.Map; import ...

  10. as3corelib系列教程之一:ArrayUtil类的用法

    as3corelib是一个非常不错的开源开发包,里面封装的类用起来都非常方便,不过可惜的是放出来的下载包里面只有一个关于JSON的Sample,这对于初学者尤其是Flex初学者来说相当的不方便.感谢H ...

最新文章

  1. C#中在应用程序和DLL使用消息
  2. jdbcTemplate 的update 和batchUpdate 方法的使用
  3. 什么是 Delta 文件
  4. TensorFlow接口升级汇总
  5. python【蓝桥杯vip练习题库】ALGO-148 5-1最小公倍数(GCD)
  6. Yongkil Kwon:EOS具有当今世界上最多中心化的协议 | 独家专访
  7. 类库,随机数,属性,值类型和引用类型
  8. C# 实现连连看功能
  9. SQLMAP参数中文解说
  10. 后处理曲线编辑_LSPREPOST后处理
  11. 冲击波病毒简介及解决方法
  12. 计算机专业对于英语水平的要求,英语对计算机专业的重要性及如何提高英语水平...
  13. 坚果手机 误进FastBoot Mode解决方案
  14. Gitlab用户角色权限Guest、Reporter、Developer、Master、Owner
  15. layui 改写 table 排序,填加中文按照拼音排序
  16. 简化3D渲染和动画制作丨上海道宁为您带来强大的3D渲染软件——KeyShot
  17. 【Qt OpenGL教程】14:轮廓字体
  18. 蓝牙nrf52832的架构和开发
  19. CPU是如何制造出来的?高清图解
  20. dio java,Flutter基础(十一)网络请求(Dio)与JSON数据解析

热门文章

  1. 解决Firefox火狐打不开Axure原型图
  2. centos7镜像文件
  3. 嵌入式linux应用开发完全手册 第2版面市
  4. 5G+北斗RTK定位:高精度定位技术发展更进一步
  5. VS2017离线下载、安装教程
  6. 那些你所不知道的文献下载网址经验总结
  7. 数学史思维导图_高中数学课堂教学中思维导图的制作运用
  8. angular报错:Maximum call stack size exceeded
  9. 算术编码数据压缩Matlab报告,用matlab实现算术编码
  10. VMware 10激活码