ManualResetEvent的用法
- 初始化:
- 创建一个ManualResetEvent实例,并设置其初始状态。通常,初始状态可以设置为false(表示事件尚未发生)或true(表示事件已经发生)。例如:
ManualResetEvent mre = new ManualResetEvent(false);
- 创建一个ManualResetEvent实例,并设置其初始状态。通常,初始状态可以设置为false(表示事件尚未发生)或true(表示事件已经发生)。例如:
- 等待事件:
- 在需要等待事件发生的线程中,调用
WaitOne()
方法。如果ManualResetEvent的状态为false,该方法会阻塞当前线程,直到状态变为true。例如:mre.WaitOne();
- 在需要等待事件发生的线程中,调用
- 发出事件:
- 当某个条件满足或某个事件发生时,通过调用
Set()
方法来通知等待的线程。这会将ManualResetEvent的状态设置为true,从而允许在WaitOne()
处阻塞的线程继续执行。例如:mre.Set();
- 当某个条件满足或某个事件发生时,通过调用
- 重置事件:
- 如果需要重置ManualResetEvent的状态为false,可以调用
Reset()
方法。之后,线程在调用WaitOne()
时会再次阻塞。例如:mre.Reset();
- 如果需要重置ManualResetEvent的状态为false,可以调用
- 多线程通知:
- 一个重要的特性是,一次
Set()
调用可以释放所有在WaitOne()
上阻塞的线程,这使得ManualResetEvent非常适合用于广播式通知场景。
- 一个重要的特性是,一次
AutoResetEvent的用法
- 初始化:
- 创建一个AutoResetEvent实例,并设置其初始状态,通常设置为false。例如:
AutoResetEvent autoEvent = new AutoResetEvent(false);
- 创建一个AutoResetEvent实例,并设置其初始状态,通常设置为false。例如:
- 等待事件:
- 在需要等待事件发生的线程中,调用
WaitOne()
方法。如果AutoResetEvent的状态为false,线程会在此处阻塞。例如:autoEvent.WaitOne();
- 在需要等待事件发生的线程中,调用
- 发出事件:
- 当需要通知等待的线程时,调用
Set()
方法。这会将AutoResetEvent的状态设置为true,并唤醒一个等待的线程(如果有的话)。状态随后会自动重置为false。例如:autoEvent.Set();
- 当需要通知等待的线程时,调用
- 单线程通知:
- 与ManualResetEvent不同,AutoResetEvent在唤醒一个线程后会自动将状态重置为false。这意味着每次
Set()
调用只会唤醒一个线程,使其适合用于一对一的通知场景。
- 与ManualResetEvent不同,AutoResetEvent在唤醒一个线程后会自动将状态重置为false。这意味着每次
//定义 public class XHL { //一次set释放一个等待的线程 public AutoResetEvent autoResetEvent = new AutoResetEvent(false); //一次set释放所有等待的线程 public ManualResetEvent manualResetEvent = new ManualResetEvent(false); public void ManualResetEvent() { manualResetEvent.WaitOne(); Console.WriteLine("ManualResetEvent"); manualResetEvent.Reset(); } public void AutoResetEvent() { autoResetEvent.WaitOne(); Console.WriteLine("AutoResetEvent"); autoResetEvent.Reset(); } } //调用 XHL xHL=new XHL(); Task.Run(() => { xHL.ManualResetEvent(); }); Task.Run(() => { xHL.ManualResetEvent(); }); Task.Run(() => { xHL.ManualResetEvent(); }); Task.Run(() => { xHL.ManualResetEvent(); }); Task.Run(() => { xHL.AutoResetEvent(); }); Task.Run(() => { xHL.AutoResetEvent(); }); Task.Run(() => { xHL.AutoResetEvent(); }); Task.Run(() => { xHL.AutoResetEvent(); }); Thread.Sleep(3000); Console.WriteLine("ManualResetEvent Set"); xHL.manualResetEvent.Set(); Thread.Sleep(3000); Console.WriteLine("AutoResetEvent Set"); xHL.autoResetEvent.Set();
Semaphore的用法
Semaphore
是一种同步原语,用于控制对共享资源的访问。它允许多个线程同时访问资源,但限制同时访问的最大线程数。这非常适合于控制对有限资源的并发访问,例如数据库连接池或文件句柄。
Semaphore
类位于 System.Threading
命名空间中,其构造函数通常接受两个参数:初始可用资源和最大可用资源。这两个值可以是相同的,也可以不同,具体取决于你的使用场景。
//空闲数、允许最大线程个数 static Semaphore semaphore = new Semaphore(3, 3); public static void SleepTask_Semaphore() { semaphore.WaitOne();//等待一个线程 Thread.Sleep(100); semaphore.Release();//释放线程 }
标签:false,AutoResetEvent,ManualResetEvent,xHL,信号量,线程,多线程,WaitOne From: https://www.cnblogs.com/daiwk/p/18251482