C#中ManualResetEvent用法

655Z技术栈 C#编程 2025年07月31日 6

在C#中,ManualResetEvent是一个线程同步的工具,用于控制多线程之间的同步操作。下面是ManualResetEvent的基本用法:

  1. 初始化ManualResetEvent对象:
ManualResetEvent mre = new ManualResetEvent(false);

这里的参数false表示初始状态为非终止状态,即阻塞线程。

  1. 线程等待ManualResetEvent信号:
mre.WaitOne();

当线程执行到这里时,如果ManualResetEvent的状态是非终止状态,则线程会被阻塞,直到ManualResetEvent收到信号。

  1. 发送信号给等待的线程:
mre.Set();

当某个线程调用Set()方法后,ManualResetEvent的状态变为终止状态,并且所有正在等待的线程会被唤醒。

  1. 重置ManualResetEvent状态:
mre.Reset();

调用Reset()方法将ManualResetEvent的状态重置为非终止状态。

需要注意的是,ManualResetEvent可以在多个线程之间进行同步操作。如果有多个线程在等待ManualResetEvent的信号,当ManualResetEvent收到信号后,所有等待的线程都会被唤醒。此外,ManualResetEvent还提供了一个WaitOne方法的重载版本,可以指定等待的超时时间。

下面是一个示例,演示了如何使用ManualResetEvent实现线程的同步操作:

class Program { static ManualResetEvent mre = new ManualResetEvent(false); static void Main(string[] args) { Thread t1 = new Thread(Worker1); Thread t2 = new Thread(Worker2); t1.Start(); t2.Start(); Thread.Sleep(2000); // 等待一段时间 mre.Set(); // 发送信号给等待的线程 Console.ReadKey(); } static void Worker1() { Console.WriteLine("Worker1开始等待..."); mre.WaitOne(); // 等待信号 Console.WriteLine("Worker1收到信号,继续执行..."); } static void Worker2() { Console.WriteLine("Worker2开始等待..."); mre.WaitOne(); // 等待信号 Console.WriteLine("Worker2收到信号,继续执行..."); } }

在上面的示例中,Worker1和Worker2线程都会等待ManualResetEvent的信号。在Main方法中,我们等待一段时间后通过mre.Set()方法发送信号给等待的线程。然后Worker1和Worker2线程会被唤醒并继续执行后续的代码。

提供PHP及ThinkPHP框架的定制开发、代码优化,PHP修改、ThinkPHP修改。

邮箱:yvsm@163.com 微信:yvsm316 QQ:316430983
关闭

用微信“扫一扫”