ManualResetEvent知识总结
一、 用法概述
Manual发音:英[ˈmænjuəl]
直译,手动重置事件
开发者的可以手动对线程间的交互进行手动控制.
二、构造函数
构造函数,如果为 true,则将初始状态设置为终止;如果为 false,则将初始状态设置为非终止。
1 2 3 | public ManualResetEvent( bool initialState //是否为 终止状态 ) |
如果 ManualResetEvent 的初始状态是终止状态(即,如果其通过为 initialState 传递true 创建),则等待 ManualResetEvent 的线程不阻塞。(亦即WaitOne方法不能阻塞当前线程的执行)
如果初始状态为非终止状态(false),则线程调用 Set() 方法后才不阻塞。
故:通常情况下,我们初始化为false(非终止状态)
三、需要理解和掌握的几个方法
1.WaiOne
阻止当前线程,直到收到信号(当然初始化状态需要为false)
WaitOne有几个重载方法,通过时间进行WaitOne,如果超时就不阻塞了.
其他几个版本:MSDN地址
2.Set
将事件状态设置为终止状态,允许一个或多个等待线程继续。
3.ReSet
将事件状态设置为非终止状态,导致线程阻止。
四、Demo(网友提供)
using System; using System.Threading; namespace ThreadingTester { class ThreadClass { public static ManualResetEvent mre= new ManualResetEvent( false ); public static void trmain() { Thread tr = Thread.CurrentThread; Console.WriteLine( "thread: waiting for an event" ); mre.WaitOne(11); Console.WriteLine( "thread: got an event" ); for ( int x=0;x < 10;x++) { Thread.Sleep(1000); Console.WriteLine(tr.Name + ": " + x); } } static void Main( string [] args) { Thread thrd1= new Thread( new ThreadStart(trmain)); thrd1.Name= "thread1" ; thrd1.Start(); for ( int x=0;x < 10;x++) { Thread.Sleep(900); Console.WriteLine( "Main:" + x); if (5==x) mre.Set(); } while (thrd1.IsAlive) { Thread.Sleep(1000); Console.WriteLine( "Main: waiting for thread to stop" ); } Console.Read(); } } } |
五、使用场景
通常出现用于 不同功能的代码且位于不同的线程之中时, 需要进行数据协同.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!