《C#多线程编程实战》2.5 AutoResetEvent
这个有点像是缩小版的mutex
还是很好理解的
相对mutex 使用的范围可能比较小一点。
class Program { static AutoResetEvent work = new AutoResetEvent(false); static AutoResetEvent main = new AutoResetEvent(false); static void P(int s) { Console.WriteLine($"第二线程要等待{s}"); Thread.Sleep(TimeSpan.FromSeconds(s)); Console.WriteLine("第二线程等待结束"); work.Set();//告诉work 不用等待 Console.WriteLine("等待主线程完成工作"); main.WaitOne();//main 堵塞 Thread.Sleep(TimeSpan.FromSeconds(s)); Console.WriteLine("第二线程结束"); work.Set();//不用等待 } static void Main(string[] args) { var t = new Thread(() => P(10)); t.Start(); Console.WriteLine($"等待别的线程完成工作"); work.WaitOne();//设置work等待 Console.WriteLine("设置work线程等待"); Thread.Sleep(TimeSpan.FromSeconds(5)); Console.WriteLine("主线程等待5s 已经结束"); main.Set();//告诉main 不用等待 work.WaitOne();//告诉 work要等待 Console.WriteLine("主线程结束"); Console.ReadKey(); } }
一般来说就是
在实例化的时候,要设置为false 如果为true 那waiteone就不会有效果。
其次 waiteone就是要堵塞,等待。
set就是发出解锁信号,让AutoResetEvent不再等待。
也是非常好理解的。
下面的例子是当实例化时 传入true时 为何waiteOne不再起效
static AutoResetEvent main = new AutoResetEvent(true); static void Main(string[] args) { if( main.WaitOne(5000, false)) { Console.WriteLine("如果实例化AutoRecstEnvet向构造函数中传递true时 WaiteOne不会等待"); } else { main.Set(); Console.WriteLine("所以直接解锁"); } Console.ReadKey(); }
也就是当 实例化为true waiteone第一次时无法起效。
剩下的用法语也是相当简单的。
不过这个AutoResetEvent是无法用到进程之间的。
而且学习这个可以有助于理解Metux 的使用方式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现