Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ManualResetEvent详解

ManualResetEvent详解

作者头像
全栈程序员站长
发布于 2022-09-09 02:44:00
发布于 2022-09-09 02:44:00
2930
举报

大家好,又见面了,我是你们的朋友全栈君。

原文来自:http://www.cnblogs.com/tianzhiliang/archive/2011/03/04/1970726.html

1. 源码下载:

下载地址:http://files.cnblogs.com/tianzhiliang/ManualResetEventDemo.rar

Demo:

2. ManualResetEvent详解

ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。

?

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ManualResetEventDemo { class MREDemo { private ManualResetEvent _mre; public MREDemo() { this ._mre = new ManualResetEvent( true ); } public void CreateThreads() { Thread t1 = new Thread( new ThreadStart(Run)); t1.Start(); Thread t2 = new Thread( new ThreadStart(Run)); t2.Start(); } public void Set() { this ._mre.Set(); } public void Reset() { this ._mre.Reset(); } private void Run() { string strThreadID = string .Empty; try { while ( true ) { // 阻塞当前线程 this ._mre.WaitOne(); strThreadID = Thread.CurrentThread.ManagedThreadId.ToString(); Console.WriteLine( "Thread(" + strThreadID + ") is running..." ); Thread.Sleep(5000); } } catch (Exception ex) { Console.WriteLine( "线程(" + strThreadID + ")发生异常!错误描述:" + ex.Message.ToString()); } } } }

?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ManualResetEventDemo { class Program { static void Main( string [] args) { Console.WriteLine( "****************************" ); Console.WriteLine( "输入\"stop\"停止线程运行..." ); Console.WriteLine( "输入\"run\"开启线程运行..." ); Console.WriteLine( "****************************\r\n" ); MREDemo objMRE = new MREDemo(); objMRE.CreateThreads(); while ( true ) { string input = Console.ReadLine(); if (input.Trim().ToLower() == "stop" ) { Console.WriteLine( "线程已停止运行..." ); objMRE.Reset(); } else if (input.Trim().ToLower() == "run" ) { Console.WriteLine( "线程开启运行..." ); objMRE.Set(); } } } } }

转载于:https://www.cnblogs.com/nele/p/5552451.html

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161167.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
线程 ManualResetEvent 类「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。 Reset(): 当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时, 它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。
全栈程序员站长
2022/09/14
4920
线程 ManualResetEvent 类「建议收藏」
详解 ManualResetEvent
今天详细说一下ManualResetEvent 它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源 当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所
lpxxn
2018/01/31
7900
详解 ManualResetEvent
ManualResetEvent
ManualResetEvent是C#中一个比较常用的工具,可用于线程间通信,实现一种类似信号量的功能(不知道我这样描述是否恰当,有可能不是“类似”,而“就是”通过信号量来实现的,因为我也是最近才知道这个类,以前一直不知道,哈哈。如果有哪位清楚的话,请给我解惑。)。
yaphetsfang
2020/07/30
6060
ManualResetEvent浅谈
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161168.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/09
1850
ManualResetEvent浅谈
详解 ManualResetEvent
它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源
全栈程序员站长
2022/09/07
2930
多线程中的ManualResetEvent
先来看一下简单的多线程控制台程序: using System; using System.Threading; namespace ManualResetEventStudy { class ThreadClass     { static void t1()         { for (int x = 1; x <= 5; x++)             {                 Thread.Sleep(500);                 Console.WriteLin
菩提树下的杨过
2018/01/23
8350
c#线程-线程同步
如果有多个线程同时访问共享数据的时候,就必须要用线程同步,防止共享数据被破坏。如果多个线程不会同时访问共享数据,可以不用线程同步。 线程同步也会有一些问题存在: 1、性能损耗。获取,释放锁,线程上下文建切换都是耗性能的。 2、同步会使线程排队等待执行。
苏州程序大白
2021/08/13
8470
线程同步(一)
当多个线程同时对同一个内存地址进行写入时,由于CPU时间调度上的问题写入数据会被多次的覆盖,所以就要使线程同步。所谓的同步就是协同步调,按预定的先后次序进行运行。线程同步是指多线程通过特定的设置来控制线程之间的执行顺序,也可以说是在线程之间通过同步建立起执行顺序的关系。.Net 为我们提供了多种线程同步的解决方案:
喵叔
2020/09/08
7600
C#多线程同步事件及等待句柄
最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也简要提了一下System.Threading.WaitHandle.WaitOne 、System.Threading.WaitHandle.WaitAny和System.Threading.WaitHandle.WaitAll ,下面我们一最初学者的角度来看,多线程之间的同步。
全栈程序员站长
2022/09/14
1.3K0
C#超高速高性能写日志 代码开源
需求很简单,就是在C#开发中高速写日志。比如在高并发,高流量的地方需要写日志。我们知道程序在操作磁盘时是比较耗时的,所以我们把日志写到磁盘上会有一定的时间耗在上面,这些并不是我们想看到的。
郑子铭
2023/08/29
3490
C#超高速高性能写日志 代码开源
多线程系列(三)之线程池
.NetFramework1.0时代的Thread,API功能繁多,对线程的数量是没有管控的,在.NetFramework2.0时代推出了ThreadPool,如果某个对象创建和销毁代价比较高,同时这个对象还可以反复使这些线程,就需要使用线程池,线程池可以保存多个线程对象,需要使用线程时直接从线程池里面拿,使用完之后不做释放,又放回池子(享元模式),需要用的时候再去拿。这样可以减少创建线程的开销,提升性能,此外,还可以管控线程的总数量,防止资源滥用。
指尖改变世界
2020/08/25
5340
ManualResetEvent的理解和使用[通俗易懂]
可见,没有信号时,WaitOne()后面的语句都不执行(被阻塞),当Set()释放信号后,所有阻塞的线程都开始继续执行。
全栈程序员站长
2022/09/09
3240
ManualResetEvent的理解和使用[通俗易懂]
基元线程同步——内核模式构造(WaitHandle,EventWaitHandle,AutoResetEvent,ManualResetEvent,Semaphore,Mutex)
内核模式构造,采用的是windows操作系统来同步线程,比VolatileRead,VolatileWrite,Interlocked等用户模式的构造慢很多。相对于用户模式的构造,它也有自己的优点:
Java架构师必看
2022/02/27
4130
ManualResetEvent使用演示
ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。 当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。 一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。 可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。
全栈程序员站长
2022/09/09
5580
对AutoResetEvent和ManualResetEvent的理解
AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne、Set和Reset。
全栈程序员站长
2022/09/09
5480
对AutoResetEvent和ManualResetEvent的理解
C#笔记:RSA加解密实现
上回研究产生大素数,产生大素数,肯定是和加密有关的。现在我们就来实现RSA算法。哈哈。
超级大猪
2019/11/22
1.5K0
[C#][原创]HttpWebRequest Timeout设置后还是卡好久的问题
在HTTP GET或者POST时候,如果网络正常的话,通常我们可以正常返回数据,但是一旦网络断网或者异常,就会卡在GetResponse这里,通过设置Timeout属性似乎可以解决这个问题,但是结果出人意外,当你设置为1000毫秒时候,居然还会卡20秒才会抛出超时异常,这是不能忍受的,由于某些场景下我们需要特定访问网络,而且要求必须3秒内访问返回数据,但是这么一来岂不是没得玩了?我上网查了很多资料,没有很好的解决方案,除了一种方法,那就是函数超时,我们可以设定函数执行一定时间,如果超过时间则抛出异常,这样一来可以解决这个问题,但是总觉得十分不爽,微软这个HTTP访问就这么垃圾?没办法,只能这么做,有篇博客就是按照这个思路来的https://blog.csdn.net/qhr2617869/article/details/51305259,为了记录备份他的方法我记录在这:
云未归来
2025/07/18
720
.NET简谈组件程序设计之(手动同步)
在上一篇文章“.NET简谈组件程序设计之(上下文与同步域) ”中,我们学习了关于一些上下文和同步域的概念,可以利用这两个技术来进行自动同步。
王清培
2022/03/14
2930
.NET简谈组件程序设计之(手动同步)
线程间通讯:WaitHandler使用实例及分析
实例效果: 1.点击“启动线程”会启动一个线程t每隔2秒在listbox上插入一条新记录。 2.点击“关闭线程”会停止线程t,但不是马上停止而是等待线程t当次循环的工作后再结束。 Form1.cs
^_^肥仔John
2018/01/18
6840
线程间通讯:WaitHandler使用实例及分析
C# 生产者与消费者模式
方法2:双缓存队列处理,意思就是说,用两个队列,一个队列用于获取数据,另一个队列用于操作数据,通过信号量来处理线程调度,来取消“锁”带来的资源切换浪费,参考代码如下
zls365
2021/01/13
1.5K0
相关推荐
线程 ManualResetEvent 类「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档