C#多线程(7):手动线程通知
区别与示例
AutoResetEvent 和 ManualResetEvent 十分相似。两者之间的区别,在于前者是自动(Auto),后者是手动(Manua)。
你可以先运行下面的示例,再测试两者的区别。
AutoResetEvent 示例:
class Program
{
// 线程通知
private static AutoResetEvent resetEvent = new AutoResetEvent(false);
static void Main(string[] args)
{
// 创建线程
new Thread(DoOne).Start();
// 用于不断向另一个线程发送信号
while (true)
{
Console.ReadKey();
resetEvent.Set(); // 发生通知,设置终止状态
}
}
public static void DoOne()
{
Console.WriteLine("① 等待中,请发出信号允许我运行");
resetEvent.WaitOne();
Console.WriteLine("② 等待中,请发出信号允许我运行");
resetEvent.WaitOne();
Console.WriteLine("③ 等待中,请发出信号允许我运行");
// ...
Console.WriteLine("线程结束");
}
}
ManualResetEvent 类示例:
class Program
{
private static ManualResetEvent resetEvent = new ManualResetEvent(false);
static void Main(string[] args)
{
new Thread(DoOne).Start();
// 用于不断向另一个线程发送信号
while (true)
{
Console.ReadKey();
resetEvent.Set(); // 发生通知,设置终止状态
}
}
public static void DoOne()
{
Console.WriteLine("等待中,请发出信号允许我运行");
resetEvent.WaitOne();
// 后面的都无效,线程会直接跳过而无需等待
resetEvent.WaitOne();
resetEvent.WaitOne();
resetEvent.WaitOne();
resetEvent.WaitOne();
resetEvent.WaitOne();
Console.WriteLine("线程结束");
}
}
因为 AutoResetEvent 对象在 .WaitOne() 方法等待信号完毕后,会自动重置为非终止状态,相当于高速收费站自动闸门,一辆车过去后,机器自动关闸。
ManualResetEvent 相当于人工闸门,打开后编写人工关闭闸门,不然的话闸门会一直处于打开状态。
ManualResetEvent 主要用于更加灵活的线程信号传递场景。
ManualResetEvent 类
表示线程同步事件,收到信号时,要想下一次依然生效,必须手动重置该事件。
因为 ManualResetEvent 类跟 AutoManualResetEvent 类十分接近,这里就不赘述了。
它们的使用区别主要是:
AutoResetEvent 类,每次 Set() ,跳过一个 WaitOne()。因为会 自动恢复设置,所以下次碰到 WaitOne() 会继续等待。
ManualResetEvent 类, Set() 后,不会重置设置,因此一旦使用了 Set() 后,就会一路放通,不会再等待。
其构造函数如下:
| 构造函数 | 说明 |
|---|---|
| ManualResetEvent(Boolean) | 用一个指示是否将初始状态设置为终止的布尔值初始化 ManualResetEvent 类的新实例。 |
其常用方法如下:
| 方法 | 说明 |
|---|---|
| Close() | 释放由当前 WaitHandle 占用的所有资源。 |
| Reset() | 将事件状态设置为非终止,从而导致线程受阻。 |
| Set() | 将事件状态设置为有信号,从而允许一个或多个等待线程继续执行。 |
| WaitOne() | 阻止当前线程,直到当前 WaitHandle 收到信号。 |
| WaitOne(Int32) | 阻止当前线程,直到当前 WaitHandle 收到信号,同时使用 32 位带符号整数指定时间间隔(以毫秒为单位)。 |
| WaitOne(Int32, Boolean) | 阻止当前线程,直到当前的 WaitHandle 收到信号为止,同时使用 32 位带符号整数指定时间间隔,并指定是否在等待之前退出同步域。 |
| WaitOne(TimeSpan) | 阻止当前线程,直到当前实例收到信号,同时使用 TimeSpan 指定时间间隔。 |
| WaitOne(TimeSpan, Boolean) | 阻止当前线程,直到当前实例收到信号为止,同时使用 TimeSpan 指定时间间隔,并指定是否在等待之前退出同步域。 |
ManualResetEventSlim
ManualResetEventSlim 相对 ManualResetEvent ,当等待时间预计非常短并且事件不跨越进程边界时,可以使用此类来获得比 ManualResetEvent 更好的性能。
从代码使用来看,没有啥区别,主要就是考虑性能下时,两者不同场景。
这里就不对这两个类型赘述了。
C#多线程(7):手动线程通知的更多相关文章
- C#多线程(6):线程通知
目录 AutoRestEvent 类 常用方法 一个简单的示例 解释一下 复杂一点的示例 解释 回顾一下,前面 lock.Monitor 部分我们学习了线程锁,Mutex 部分学习了进程同步,Sema ...
- 20190102(多线程,守护线程,线程互斥锁,信号量,JoinableQueue)
多线程 多进程: 核心是多道技术,本质上就是切换加保存技术. 当进程IO操作较多,可以提高程序效率. 每个进程都默认有一条主线程. 多线程: 程序的执行线路,相当于一条流水线,其包含了程序的具体执行步 ...
- .NET面试题解析(07)-多线程编程与线程同步
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等, ...
- .NET面试题解析(07)-多线程编程与线程同步 (转)
http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...
- C#学习笔记之线程 - 通知Signal
通知事件等待句柄 Signal With EventWaitHandle 事件等待句柄常用于通知.当一个线程等待直到接收到另外一个线程发出的信号.事件等待句柄是最简单的信号结构,它与C#事件无关.有三 ...
- VC中利用多线程技术实现线程之间的通信
当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...
- -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
- Python中的多线程编程,线程安全与锁(二)
在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...
- 转:java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例
java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例 1.CountDownLatch:一个同步工具类,它允许一个或多个线程一 ...
- Java多线程并发02——线程的生命周期与常用方法,你都掌握了吗
在上一章,为大家介绍了线程的一些基础知识,线程的创建与终止.本期将为各位带来线程的生命周期与常用方法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程生命周期 一个线程不是被创建了 ...
随机推荐
- redis 6源码解析之 dict
edis源码的dict.c主要实现了基于hash表的操作,如增删改查,对哈希表大小的扩容和缩容,以及对哈希表的rehash和增量rehash等.在源码的dictScan函数中,非常巧妙精美地实现了对哈 ...
- R2M分布式锁原理及实践
作者:京东科技 张石磊 1 案例引入 名词简介: 资源:可以理解为一条内容,或者图+文字+链接的载体. 档位ID: 资源的分类组,资源必须归属于档位. 问题描述:当同一个档位下2条资源同时审批通过时, ...
- Github最简单上传教程:真正的两分钟就可以学会! guitar
相关链接: 码云(gitee)配置SSH密钥 码云gitee创建仓库并用git上传文件 git 上传错误This oplation equires one of the flowi vrsionsot ...
- PGL图学习项目合集&数据集分享&技术归纳业务落地技巧[系列十]
PGL图学习项目合集&数据集分享&技术归纳业务落地技巧[系列十] 1.PGL图学习项目合集 1.1 关于图计算&图学习的基础知识概览:前置知识点学习(PGL)[系列一] :ht ...
- 【六】强化学习之DQN---PaddlePaddlle【PARL】框架{飞桨}
相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...
- ROS之交叉编译配置
参考资料: https://zhuanlan.zhihu.com/p/183819313 https://www.guyuehome.com/33759 1.原理 所谓的交叉编译,其实我们可以从编译原 ...
- SSD数据不能恢复?或许还有的救
我们经常说机械硬盘相对于固态硬盘的一个优势是数据可以恢复,难道SSD固态硬盘的数据就不能恢复了吗? 这里先简单介绍一下SSD的工作方式,SSD中的数据是以电子的形式通过浮栅保存的,写入就是通过增加电压 ...
- QQ音乐转 mp3 格式的链接,不需要下载任何软件
一.打开QQ音乐的官网 QQ音乐-千万正版音乐海量无损曲库新歌热歌天天畅听的高品质音乐平台! 二.随便找一首歌播放 三.打开后,就可以使用了
- 手撕红黑树 | 变色+旋转你真的明白了吗?【超用心超详细图文解释 | 一篇学会Red_Black_Tree】
说在前面 我们也很久没有更新数据结构系列了,半年前博主重新深入学习了红黑树这个数据结构,一直想更新呈现给大家,最近也一直没有时间,今天红黑树它来了! 博主为了这篇博客,做了很多准备,试了很多画图软件, ...
- Oracle查询存在外键约束但未创建对应索引的情况
1.Oracle提供的脚本 2.网络搜索到的脚本 3.改为可以指定用户的脚本 4.测试脚本使用 1.Oracle提供的脚本 如果要求管控严格,可以考虑使用Oracle官方提供的脚本. Script t ...