当主程序启动时,首先创建ManualResetEventSlim 类的一个实例。然后启动三个线程,等待事件信号通知它们继续执行。

 /// <summary>
/// 创建 ManualResetEventSlim 实例
/// </summary>
private static ManualResetEventSlim _mainEvent = new ManualResetEventSlim(false); /// <summary>
/// 接收信号继续执行
/// </summary>
/// <param name="threadName">线程名</param>
/// <param name="secods">时间(秒)</param>
public void TravelThroughGates(string threadName, int secods)
{
// threadName falls to sleep
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(secods)); // threadName waits for the gates to open
_mainEvent.Wait(); // 阻止当前线程,直到接收到信号 // threadName enters the gates
Console.WriteLine($"{threadName} 继续执行"); }

线程只有在ManualResetEventSlim 对象发出信号才能继续执行,不然只有继续等待,直到接接收到信号。

 /// <summary>
/// 输出
/// </summary>
public void Print()
{
var t1 = new System.Threading.Thread(() => TravelThroughGates("Thread 1", ));
var t2 = new System.Threading.Thread(() => TravelThroughGates("Thread 2", ));
var t3 = new System.Threading.Thread(() => TravelThroughGates("Thread 3", )); t1.Start();
t2.Start();
t3.Start();
System.Threading.Thread.Sleep(TimeSpan.FromSeconds()); // The gates are now open
_mainEvent.Set(); // 发射信号 System.Threading.Thread.Sleep(TimeSpan.FromSeconds());
_mainEvent.Reset(); // 关闭信号 // The gates have been closed
System.Threading.Thread.Sleep(TimeSpan.FromSeconds()); // The gates are now open for the second time
_mainEvent.Set(); // 发射信号 System.Threading.Thread.Sleep(TimeSpan.FromSeconds()); //The gates have been closed
_mainEvent.Reset(); // 关闭信号
}

线程之间灵活传递信号(ManualResetEventSlim )的更多相关文章

  1. Android消息机制之实现两个不同线程之间相互传递数据相互调用

    目的:实现两个不同线程之间相互传递数据相互调用方法. 线程一中定义mainHandler 并定义一个方法mainDecode 线程二中定义twoHandler 并定义一个方法twoEncode 实现当 ...

  2. 参数在一个线程中各个函数之间互相传递的问题(ThreadLocal)

    ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接,HTTP请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源. 一个ThreadLocal变量虽然是 ...

  3. 详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)

    使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享 ...

  4. ThreadLocal父子线程之间的数据传递问题

    一.问题的提出 在系统开发过程中常使用ThreadLocal进行传递日志的RequestId,由此来获取整条请求链路.然而当线程中开启了其他的线程,此时ThreadLocal里面的数据将会出现无法获取 ...

  5. jmeter中线程之间传递参数

    JMeter 变量作用域局限于所属线程.这样设计是经过深思熟虑的,目的是让测试线程能够独立运转.有时候用户可能需要在不同线程间(可能属于同一个线程组,也可能不属于同一个线程组)传递变量. 其中一种方法 ...

  6. Qt 在相同的线程中可以在信号中传递未注册的元对象,在非相同线程中则不能传递未测试的对象,为什么呢?

    有兄台知道可以在留言告诉我,万分感谢!!! 需求:需要在多线程中传递未注册的非元对象数据,时间紧急,无法及时更改该传递的数据为元对象,非继承 QObject 这里采用指针方式传递,同时把传递的局部变量 ...

  7. VC中利用多线程技术实现线程之间的通信

    当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...

  8. [转帖]Linux系统进程的知识总结,进程与线程之间的纠葛...

    Linux系统进程的知识总结,进程与线程之间的纠葛... https://cloud.tencent.com/developer/article/1500509 当一个程序开始执行后,在开始执行到执行 ...

  9. Linux系统进程的知识总结,进程与线程之间的纠葛...

    来源:嵌入式ARM 当一个程序开始执行后,在开始执行到执行完毕退出这段时间内,它在内存中的部分就叫称作一个进程. Linux 是一个多任务的操作系统,也就是说,在同一时间内,可以有多个进程同时执行.我 ...

随机推荐

  1. 为什么重复的GET请求变慢了?

    最近在研究慢请求监控的问题,写了一个简单的测试代码:在网页端(index.html)通过fetch函数向服务端获取数据,然后打印请求耗时. function requestData() { let s ...

  2. ansible服务部署

    1.ansible.cfg配置文件 [defaults] #inventory= /home/op/ansible/testing #sudo_user=root remote_port=9122 r ...

  3. odoo10学习笔记十二:web controller

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189332.html 一:路由 odoo.http.route(route=None, **kw) 装饰器 ...

  4. Python从零开始——元组tuple

    一:元组知识内容 二:元组的不可变性 三:元组创建 四:元组操作

  5. 201871010117--石欣钰--《面向对象程序设计(java)》第十六周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh 这个作业的要求在哪里 https://www.cnblogs.com ...

  6. 201871010131-张兴盼《面向对象程序设计(java)》第八周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  7. Tools分类随笔链接整理贴(不定期更新)

    1.编程开发工具 Vs2012安装介绍   https://www.cnblogs.com/fzxiaoyi/p/12041854.html Vs2012帮助文档安装介绍  https://www.c ...

  8. day32_8_14 并发编程三 线程的GIL

    一.GIL 什么是GIL? GIL是一个全局排他锁,简单来说就是为了防止多线程并行操作的锁.这里有官方解释: In CPython, the global interpreter lock, or G ...

  9. 14-numpy笔记-莫烦pandas-2

    代码 import pandas as pd import numpy as np dates = pd.date_range('20130101', periods=6) df=pd.DataFra ...

  10. 深度学习的encoder和decoder

    所谓编码,就是将输入序列转化成一个固定长度的向量:解码,就是将之前生成的固定向量再转化成输出序列.