ManualResetEvent是如何工作的

在内存中保持着一个bool值,如果bool值为False,则使所有线程阻塞,反之,如果bool值为True,则使所有线程退出阻塞。当我们创建ManualResetEvent对象的实例时,我们在函数构造中传递默认的bool值,以下是实例化ManualResetEvent的例子。

ManualResetEvent gManualResetEvent = new ManualResetEvent(false);

在上面代码中,我们初始化了一个值为False的ManualResetEvent对象,这意味着所有调用WaitOne放的线程将被阻塞,直到有线程调用了 Set() 方法。而如果我们用值True来对ManualResetEvent对象进行初始化,所有调用WaitOne方法的线程并不会被阻塞,可以进行后续的执行。

WaitOne方法

该方法阻塞当前线程并等待其他线程发送信号。如果收到信号,它将返回True,反之返回False。以下演示了如何调用该方法。

gManualResetEvent.WaitOne();

在WaitOne方法的第二个重载版本中,我们可以指定当前线程等待信号的时间间隔。如果在时间间隔内,没有收到信号,方法将返回False并继续执行。以下代码演示了带时间间隔参数的WaitOne调用。

bool isSignalled = gManualResetEvent.WaitOne(TimeSpan.FromSeconds(5));

我们指定了5秒作为WaitOne方法的参数,如果manualResetEvent对象在5秒内收到信号,它将isSignalled赋值为False。

Set方法

该方法用于给所有等待线程发送信号。 Set() 方法的调用使得ManualResetEvent对象的bool变量值为True,所有线程被释放并继续执行。下面是调用的例子:

gManualResetEvent.Set();

Reset方法

一旦我们调用了ManualResetEvent对象的Set()方法,它的bool值就变为true,我们可以调用Reset()方法来重置该值,Reset()方法重置该值为False。以下是调用Reset方法的例子:

gManualResetEvent.Reset();

如果我们想多次发送信号,那么我们必须在调用Set()方法后立即调用Reset()方法。

ManualResetEvent 例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp_ForTest
{internal class Program{private static ManualResetEvent gManualResetEvent = new ManualResetEvent(false);static void Main(string[] args){Thread t1 = new Thread(new ThreadStart(TestMethod));t1.IsBackground = true;t1.Start();while(true){if (Console.ReadKey().Key.ToString() == "C"){gManualResetEvent.Set();    //开启}if (Console.ReadKey().Key.ToString() == "D"){gManualResetEvent.Reset();  //阻塞}}}public static void TestMethod(){while(true) {gManualResetEvent.WaitOne();//Thread.Sleep(500); Console.Write("HELLO    ");gManualResetEvent.Reset();}}}
}

控制台界面,输入C

查看输出

C#中ManualResetEvent用法相关推荐

  1. C#中ManualResetEvent用法简介

    简单介绍 多个线程可以通过调用ManualResetEvent对象的WaitOne方法进入等待或阻塞状态.当控制线程调用Set()方法,所有等待线程将恢复并继续执行. ManualResetEvent ...

  2. c++中static_cast用法与uchar/char的区别

    1.c++中static_cast用法 static_cast是指显性类型强制转换,如: int a = static_cast<int>(120.34); 结果为a= 120. 和C语言 ...

  3. 简单介绍Python中异常处理用法

    这篇文章主要给大家分享的是 Python中异常处理用法,为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,下面来看看文章对此的用法,需要的朋友可以参考一下 为了保证程 ...

  4. 关于OpenCV中常见函数用法总结

    关于OpenCV中常见函数用法总结 一 一般Mat的赋值操作 二 求Mat中的最大值以及最小值 三 randn()函数给图像添加高斯噪声 四 mean()函数的用法 五 系统计时器 六 矩阵之间的四则 ...

  5. java中import用法

    java中import用法 单类型导入(single-type-import),例如import java.io.File; 按需类型导入(type-import-on-demand),例如 impo ...

  6. 一个线程中lock用法的经典实例

    1 /* 2 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 3 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 4 作者: ...

  7. 几个比较好用的Windows API在C#中的用法。

    几个比较好用的Windows API在C#中的用法. #region Windows Api 定义 ///   /// 模拟鼠标事件   ///   /// 鼠标事件的Enum   /// X座标   ...

  8. python管道界面_python中管道用法入门实例

    本文实例讲述了python中管道用法.分享给大家供大家参考.具体如下: #!coding=utf-8 import multiprocessing def consumer(pipe): output ...

  9. MVC中HtmlHelper用法大全

    MVC中HtmlHelper用法大全参考 解析MVC中HtmlHelper控件7个大类中各个控件的主要使用方法(1) 2012-02-27 16:25 HtmlHelper类在命令System.Web ...

最新文章

  1. python 命令-Python中执行系统命令的四种方法
  2. 【视频块文件系统不得不说的故事】VBFS文件系统简介
  3. 按位异或运算和求反运算解析
  4. jzoj3783-[NOIP2014模拟8.19]签到题【结论题】
  5. 【Java中级篇】使用zxing生成二维码
  6. 【yarn】yarn 命令行查看 资源状态
  7. 开务正式加入中国信通院数据库应用创新实验室
  8. 计算机网络的通信主体,计算机网络试题及答案
  9. Ubuntu server 20.4 配置静态ip
  10. 并发编程之:Atomic
  11. 李嘉诚:没有人愿意贫穷,但出路在哪(转自意林)
  12. 计算机顶会:投稿时间 会议介绍
  13. 使用Camtasia来给视频或者图片调色
  14. world标题是大写数字,题注要阿拉伯数字,交叉引用不会出错
  15. 星起航:抖音小店体验分低怎么办,如何提高店铺体验评分?
  16. PHP 递归函数的理解
  17. Matlab中的resample函数和decimate函数
  18. EAS客户端提示找不到第三方类可能的原因
  19. RS485利用地址主动仲裁驱动
  20. paddlepaddle 20 指数移动平均(ExponentialMovingAverage,EMA)的实现与使用(支持静态图与动态图)

热门文章

  1. Jsp程序设计-数据库练习题(二)
  2. 华为p10自带计算机,华为P10评测:EMUI 5.1越用越快、总结
  3. .obj 和 .mtl文件格式
  4. kitty猫的基因编码
  5. 《WEB性能测试实战》之WEB性能测试分析
  6. Vue双向绑定:原理篇(详细)
  7. Spring Boot 实践折腾记(10):响应式编程支持库Reactor
  8. 初学者建模和布线技巧
  9. 免费实用的jpg转换成pdf工具
  10. Java数据结构---hashMap