ManualResetEvent 是 C# 中的一个线程同步类,用于控制多个线程的执行顺序。
ManualResetEvent 有两个状态:设置和非设置。默认情况下,ManualResetEvent 的状态为非设置。线程可以通过调用 ManualResetEvent 的 Set() 方法将其状态设置为设置状态,也可以调用 Reset() 方法将其状态设置为非设置状态。
ManualResetEvent 的两个主要方法是 WaitOne() 和 Set()。WaitOne() 方法用于阻塞当前线程,直到 ManualResetEvent 的状态为设置状态。而 Set() 方法用于将 ManualResetEvent 的状态设置为设置状态,并允许等待中的线程继续执行。
下面是一个使用 ManualResetEvent 的示例:
using System; using System.Threading; class Program { static ManualResetEvent manualEvent = new ManualResetEvent(false); static void Main() { // 创建两个线程 Thread t1 = new Thread(DoWork); t1.Start(); Thread t2 = new Thread(DoWork); t2.Start(); // 执行一些其他操作 // 等待一段时间后,将 ManualResetEvent 的状态设置为设置状态,使得等待中的线程可以继续执行 Thread.Sleep(2000); manualEvent.Set(); // 等待两个线程执行完毕 t1.Join(); t2.Join(); Console.WriteLine("All threads have finished."); } static void DoWork() { Console.WriteLine("Thread {0} is waiting.", Thread.CurrentThread.ManagedThreadId); // 阻塞当前线程,直到 ManualResetEvent 的状态为设置状态 manualEvent.WaitOne(); Console.WriteLine("Thread {0} continues.", Thread.CurrentThread.ManagedThreadId); } }
在上面的示例中,我们创建了两个线程 t1 和 t2,它们都会执行 DoWork() 方法。在 DoWork() 方法中,我们首先输出当前线程的 ID,并调用 manualEvent 的 WaitOne() 方法来阻塞线程。然后,在主线程中等待一段时间后,调用 manualEvent 的 Set() 方法将其状态设置为设置状态,从而使得等待中的线程可以继续执行。最后,我们使用 t1.Join() 和 t2.Join() 方法来等待两个线程执行完毕。
通过这个示例,我们可以看到 ManualResetEvent 的使用方式:在需要等待某些条件满足时,调用 WaitOne() 方法来阻塞线程,然后通过调用 Set() 方法来唤醒等待中的线程。这样,我们就可以控制多个线程的执行顺序。