C#中ManualResetEvent用法
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方法
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用法相关推荐
- C#中ManualResetEvent用法简介
简单介绍 多个线程可以通过调用ManualResetEvent对象的WaitOne方法进入等待或阻塞状态.当控制线程调用Set()方法,所有等待线程将恢复并继续执行. ManualResetEvent ...
- c++中static_cast用法与uchar/char的区别
1.c++中static_cast用法 static_cast是指显性类型强制转换,如: int a = static_cast<int>(120.34); 结果为a= 120. 和C语言 ...
- 简单介绍Python中异常处理用法
这篇文章主要给大家分享的是 Python中异常处理用法,为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,下面来看看文章对此的用法,需要的朋友可以参考一下 为了保证程 ...
- 关于OpenCV中常见函数用法总结
关于OpenCV中常见函数用法总结 一 一般Mat的赋值操作 二 求Mat中的最大值以及最小值 三 randn()函数给图像添加高斯噪声 四 mean()函数的用法 五 系统计时器 六 矩阵之间的四则 ...
- java中import用法
java中import用法 单类型导入(single-type-import),例如import java.io.File; 按需类型导入(type-import-on-demand),例如 impo ...
- 一个线程中lock用法的经典实例
1 /* 2 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 3 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 4 作者: ...
- 几个比较好用的Windows API在C#中的用法。
几个比较好用的Windows API在C#中的用法. #region Windows Api 定义 /// /// 模拟鼠标事件 /// /// 鼠标事件的Enum /// X座标 ...
- python管道界面_python中管道用法入门实例
本文实例讲述了python中管道用法.分享给大家供大家参考.具体如下: #!coding=utf-8 import multiprocessing def consumer(pipe): output ...
- MVC中HtmlHelper用法大全
MVC中HtmlHelper用法大全参考 解析MVC中HtmlHelper控件7个大类中各个控件的主要使用方法(1) 2012-02-27 16:25 HtmlHelper类在命令System.Web ...
最新文章
- python 命令-Python中执行系统命令的四种方法
- 【视频块文件系统不得不说的故事】VBFS文件系统简介
- 按位异或运算和求反运算解析
- jzoj3783-[NOIP2014模拟8.19]签到题【结论题】
- 【Java中级篇】使用zxing生成二维码
- 【yarn】yarn 命令行查看 资源状态
- 开务正式加入中国信通院数据库应用创新实验室
- 计算机网络的通信主体,计算机网络试题及答案
- Ubuntu server 20.4 配置静态ip
- 并发编程之:Atomic
- 李嘉诚:没有人愿意贫穷,但出路在哪(转自意林)
- 计算机顶会:投稿时间 会议介绍
- 使用Camtasia来给视频或者图片调色
- world标题是大写数字,题注要阿拉伯数字,交叉引用不会出错
- 星起航:抖音小店体验分低怎么办,如何提高店铺体验评分?
- PHP 递归函数的理解
- Matlab中的resample函数和decimate函数
- EAS客户端提示找不到第三方类可能的原因
- RS485利用地址主动仲裁驱动
- paddlepaddle 20 指数移动平均(ExponentialMovingAverage,EMA)的实现与使用(支持静态图与动态图)