C# AutoResetEvent 线程间通信
一、基础
功能:通过信号机制控制线程的执行顺序,常用于线程之前的通信
案例:生产者消费者,winform 主线程和工作线程
二、核心
1、作用
通知等待的线程某个事件已发生(资源就绪、操作完成)
2、信号状态
有信号:WaitOne() 不会阻塞
无信号:WatiOne() 会阻塞,直到信号触发
3、发生信号
Set()
三、基本用法
1、声明
AutoResetEvent autoResetEvent = new AutoResetEvent(false); // 初始无信号
注意:false 无信号 或 未触发;true 有信号 或 已触发(线程一开始无需等待信号)
2、方法
a、WaitOne():阻塞当前线程,直到事件变成有信号。可以指定超出的时间
autoResetEvent.WaitOne();
b、Set():将事件设置为有信号状态
当调用Set()时, 若有线程在等待,则释放线程,并自动设置为无信号状态
当调用Set()时, 若没有线程在等待,则保持有信号状态,直到后续WaitOne() 调用自动消费信号并重置、
autoResetEvent.Set();
c、ReSet():将事件设置为无信号状态
autoResetEvent.Reset();
作用:
强制设置事件为无信号状态,无论当前是有有线程在等待
确保下一轮的WaitOne() 必须等待对方的信号,避免因残留事件导致的逻辑错误
参考:
https://blog.csdn.net/qq_39847278/article/details/145542525
https://blog.csdn.net/songhuangong123/article/details/131591253?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-131591253-blog-145542525.235^v43^pc_blog_bottom_relevance_base1&spm=1001.2101.3001.4242.1&utm_relevant_index=2
替代方案
ManualResetEventSlim:轻量级版本,性能更优。
SemaphoreSlim:控制并发访问数量。
TaskCompletionSource:基于任务的异步模式(TAP)