ManualResetEvent类的用法
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类的用法相关推荐
- python 包用法_Python 基础教程之包和类的用法
Python 基础教程之包和类的用法 这篇文章主要介绍了 Python 基础教程之包和类的用法的相关资料, 需要的朋友可以参考下 Python 是一种面向对象.解释型计算机程序设计语言,由 Guido ...
- 【ES6】JS类的用法class
[ES6]JS类的用法class 一.概述 二.构造函数constructor 三.静态方法与静态变量 查看更多ES6教学文章: 参考文献 引言:由于JS之前一直没有特有的class来定义类的语法,E ...
- string类具体用法
string类具体用法 二话不说上代码 #include<string> #include<iostream> #include<algorithm> using ...
- php分析图片水印,PHP开发的文字水印,缩略图,图片水印实现类与用法示例
本文实例讲述了PHP开发的文字水印,缩略图,图片水印实现类与用法.分享给大家供大家参考,具体如下: 1.实现类ImageToTest.class.php参考代码 class ImageToTest { ...
- Android -------GestureDetector类的用法
GestureDetector类的用法 2010-10-18 14:39:02| 分类: android|字号 订阅 GestureDetector类定义了许多触摸事件.包括 1.boole ...
- Handle类的用法
android中Handle类的用法 当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无 ...
- C# “Thread类Suspend()与Resume()已过时” 解决方法(利用ManualResetEvent类)
C# "Thread类Suspend()与Resume()已过时" 解决方法(利用ManualResetEvent类) 参考文章: (1)C# "Thread类Suspe ...
- 【Kotlin】Kotlin enum 枚举类 ( 常用用法 | 初始化成员变量 | 实现抽象方法 | 实现接口 | 获取名称和位置索引 | 调用枚举常量方法 )
文章目录 I . 枚举类常用用法 II . 枚举类初始化 III. 枚举类匿名类 IV . 枚举类实现接口 V . 获取枚举常量名称和位置索引 VI . 获取枚举常量的成员变量 VII . 调用枚举常 ...
- jsonutil java_Java实现的JSONUtil工具类与用法示例
本文实例讲述了Java实现的JSONUtil工具类与用法.分享给大家供大家参考,具体如下: import java.util.HashMap; import java.util.Map; import ...
- as3corelib系列教程之一:ArrayUtil类的用法
as3corelib是一个非常不错的开源开发包,里面封装的类用起来都非常方便,不过可惜的是放出来的下载包里面只有一个关于JSON的Sample,这对于初学者尤其是Flex初学者来说相当的不方便.感谢H ...
最新文章
- C#中在应用程序和DLL使用消息
- jdbcTemplate 的update 和batchUpdate 方法的使用
- 什么是 Delta 文件
- TensorFlow接口升级汇总
- python【蓝桥杯vip练习题库】ALGO-148 5-1最小公倍数(GCD)
- Yongkil Kwon:EOS具有当今世界上最多中心化的协议 | 独家专访
- 类库,随机数,属性,值类型和引用类型
- C# 实现连连看功能
- SQLMAP参数中文解说
- 后处理曲线编辑_LSPREPOST后处理
- 冲击波病毒简介及解决方法
- 计算机专业对于英语水平的要求,英语对计算机专业的重要性及如何提高英语水平...
- 坚果手机 误进FastBoot Mode解决方案
- Gitlab用户角色权限Guest、Reporter、Developer、Master、Owner
- layui 改写 table 排序,填加中文按照拼音排序
- 简化3D渲染和动画制作丨上海道宁为您带来强大的3D渲染软件——KeyShot
- 【Qt OpenGL教程】14:轮廓字体
- 蓝牙nrf52832的架构和开发
- CPU是如何制造出来的?高清图解
- dio java,Flutter基础(十一)网络请求(Dio)与JSON数据解析