C#中ManualResetEvent用法简介

简单介绍

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

ManualResetEvent是如何工作的

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

1

ManualResetEvent manualResetEvent = new ManualResetEvent(false);

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

WaitOne方法

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

1

manualResetEvent.WaitOne();

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

1

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

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

Set方法

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

1

manualResetEvent.Set();

Reset方法

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

1

manualResetEvent.Reset();

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

ManualResetEvent 例子

    下面的例子展示了如何使用ManualResetEvent来释放多个线程。我们用false值实例化了ManualResetEvent对象,它将阻塞所有调用WaitOne方法的线程。我们创建了两个线程,它们调用方法GetDataFromServer,并以server数量作为参数。
      在调用WaitOne方法获取第一批数量后,两个线程均等待来自调用WaitOne线程的信号。当控制线程调用manualrestEvent对象的Set方法,两个线程均被释放并继续运行。在调用Set方法后,我们立即调用了Reset方法,这将改变manualrestEvent对象的bool值为false。所以,如果线程再次调用WaitOne方法,他们仍然会被阻塞。
    在从服务器获取第二批数据后,两个线程均调用了WaitOne方法。在2秒后,控制线程再次调用Set方法释放两个线程。

class Program
{static ManualResetEvent manualResetEvent = new ManualResetEvent(false);static void Main(string[] args){Task task = Task.Factory.StartNew(() =>{GetDataFromServer(1);});Task.Factory.StartNew(() =>{GetDataFromServer(2);});//Send first signal to get first set of data from server 1 and server 2manualResetEvent.Set();manualResetEvent.Reset();Thread.Sleep(TimeSpan.FromSeconds(2));//Send second signal to get second set of data from server 1 and server 2manualResetEvent.Set();Console.ReadLine();/* Result* I get first data from server1* I get first data from server2* I get second data from server1* I get second data from server2* All the data collected from server2* All the data collected from server1*/}static void GetDataFromServer(int serverNumber){//Calling any webservice to get dataConsole.WriteLine("I get first data from server" + serverNumber);manualResetEvent.WaitOne();Thread.Sleep(TimeSpan.FromSeconds(2));Console.WriteLine("I get second data from server" + serverNumber);manualResetEvent.WaitOne();Console.WriteLine("All the data collected from server" + serverNumber);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

anaconda和python有什么不一样_黄山毛峰的味道为什么会不一样?

黄山毛峰,最早为人所熟知的黄山名茶,最经典的绿茶,特别是那种清香清爽的味道,很受茶友的喜爱。这两年经常接到茶友的电话问,为什么之次每次买的黄山毛峰都不一样,在不同的茶叶店,买的味道都不一…

Newbe.Claptrap 0.10.2 发布,Blazor 演示

Newbe.Claptrap 0.10.2 发布,我们为项目模板引入了 Minion 以及 Blazor 制作的交互界面。更新内容 类库常规升级升级了相关的所有类库至最新版本。包括 Dapr SDK 1.1 等等。项目模板增强现在,我们为最新的项目模板引入了 Minion 以演示如何使用 Minion 处…

Linux资料分享,强势来袭!

小编从大学开始,便开启资料收集功能。随着大数据时代的来临,计算机发展进入新的阶段,再加上日常的深入研究,小编收集整理了丰富的Linux资料,内容涵盖“集群类”,“监控类”、“编程类”“系统类”等。这次小…

cocoaChina中整理的知识点-对文件重新命名-利于查阅

是cocoaChina网站上下载的知识点整理,共669个知识点,我花了点时间给文件全部做了重命名,这样用来查阅或者选择性的学习会有些帮助。 文件放在115网盘,下载地址:http://115.com/file/bhkqjlx2#cocoaChina整理知识点.rar…

es6 ie不兼容 函数_ES6:什么是块级作用域?

在 ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。我们先来看一下下面这种情况:内层变量可能会覆盖外层变量。var txt 外层变量-->你好呀;function fn() {console.log(txt);if (false) {var txt 内层变量--&g…

一个简单的规则引擎例子

本例使用的规则引擎包是RulesEngine,关于RulesEngine的介绍,请自行补充,这里只是一个极简单使用场景。例子大体就是用户有一些优惠券,系统会根据用户订单情况,筛选可以使用的优惠券供用户选择,用户选择后会…

程序员面试必备的20条Python经典面试题

1、Python如何实现单例模式?Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模式:1.class Singleton(type):def __init__(cls, name, bases, dict):super(Singleton, cls).__init__(name, bases, dict)cls.instance …

Active Directory系列之十七:实战详解域信任关系

实战详解域信任关系上篇博文中我们对域信任关系作了一下概述,本文中我们将通过一个实例为大家介绍如何创建域信任关系。拓扑如下图所示,当前网络中有两个域,一个域是ITET.COM,另一个域是HOMEWAY.COM。两个域内各有一个域控制器&am…

vim 寄存器 操作_vim指令

vim 是一个基于【动词】 【名词】 建立的语法表。Vim 中常用的名词方位名词表基于字符的移动:h:左j:下k:上l:右 ^ | k 提示: h 的键位于左边,每次按下就会向…

NET问答: 如何记录 EntityFramework 中的所有 SQL 日志 ?

咨询区 PC.:我正在 MVC5 项目中使用 EF 6.0,为了方便调试和获取性能指标,我想记录 EF6 中的所有 sql 日志。在 Java/Hibernate 中,我只需要设置 hibernate.show_sqltrue 就可以了,不知道在 EF 中该如何设置等价操作呢…

35岁老程序员因身体原因没加班,老板:不想干就滚蛋

近日,某论坛上一名 35 岁老程序员说出了他最近的遭遇,高强度的工作本来就让他感觉越来越劳累,加上又在医院做了一个小手术,于是就按照公司的正常上下班时间下了班,但是领导却说了一句让他难以接受的话,都三…

centos linux 禁止ping

sysctl -w net.ipv4.icmp_echo_ignore_all1sysctl -p转载于:https://blog.51cto.com/guailele/740298

客制化键盘编程_指尖运动会,谁是打字冠军,双十一机械键盘推荐

机械键盘就只能玩游戏吗?当然不是,其实机械键盘出现还远远早于薄膜键盘,早期类似IBM、AST、HP、康柏一类的品牌机都是标配机械键盘的。早期的机械键盘确实有点笨重,尤其是白轴的机械键盘,让你毕生难忘。比黑轴更加坚硬…

分布式数据库一定会替代Oracle吗?

在传统数据库领域,Oracle一直占据了很大的市场份额,很多企业的业务系统基于此实现OLTP交易场景。近年来,随着分布式技术的发展,分布式数据库逐渐占据了OLTP领域较大的市场,尤其在互联网领域,MYSQL、PG等分布…

数模国赛要点与注意事项全分享!

暑假咻地一下就过去了,转眼数学建模国赛快到了。为了给大家最最直接的帮助,超模君特邀请到周老师为参加国赛的模友们准备了一场干货满满的赛前冲刺直播课。全天候直播,助大家一臂之力,全力冲刺数模国赛!周老师拥有多年…

如何查找业务用例和业务执行者

查找业务参与者 业务参与者可以是与业务交互的任何个人、小组、组织、公司或机器,例如: 客户合作伙伴供应商权威机构(法律、法规等等)子公司所有者和投资者(决定董事会是应为业务的一部分,还是应建模为参…

android byte[] 转string 好多问号_#WIPI# Android使用HID设备

哈罗大家好。生活总是这样计划赶不上变化&#xff0c;今天为大家分享一下新加的小功能--使用Android设备连接HID设备。安卓内部已经内置了丰富的驱动&#xff0c;所以一般的设备我们只需要简单是设置就可灵活使用。首先对清单文件做简单修改<?xml version"1.0" e…

【Redis】有序集合的交集与并集

Redis支持多种类型的数据结构&#xff0c;最简单的字符串(strings)&#xff0c;适合存储对象的哈希(hash)&#xff0c;简单的字符串列表(list)&#xff0c;无序集合(set)&#xff0c;有序集合(sorted set)&#xff0c;以及用于做基数统计的HyperLogLog&#xff0c;其中使用频率…

从小害怕数学的他,却成为了科普数学教育的数学家

谈到数学&#xff0c;你们会想到什么&#xff1f;也许部分模友们会想到数学上的公式、定理、几何图形、微积分等等&#xff0c;也许会有模友们想到高数&#xff0c;&#xff08;多数大学生的痛&#xff09;也许大家还会想起高中数学老师课堂上的“循循教诲”——看书干嘛&#…

About the windchill Command -

有关的Windchill命令 PTC提供了一个命令&#xff0c;风寒指数&#xff0c;调用Windchill的行动。对于例如&#xff0c;可以使用该命令停止和启动的Windchill&#xff0c;检查的状态 Windchill服务器&#xff0c;并创建一个新的外壳&#xff0c;并设置环境变量。它也可以用来作为…