ManualResetEvent的Reset和Set方法如下:
Reset方法将事件设置为没有信号状态,相当于发出信号时复位信号。
Set方法将事件设置为有信号状态,相当于发出信号。
下面是一个使用ManualResetEvent的具体线程示例:
class Program { static void Main(string[] args) { static ManualResetEvent evt = new ManualResetEvent(false); // 启动生产线程 Thread producerThread = new Thread(Producer); producerThread.Start(); // 启动消费线程 Thread consumerThread = new Thread(Consumer); consumerThread.Start(); producerThread.Join(); consumerThread.Join(); } static void Producer() { Console.WriteLine("Producer: Start Production"); // 模拟生产任务 Thread.Sleep(3000); // 生产完毕,发出信号 evt.Set(); Console.WriteLine("Producer: Production Finished"); } static void Consumer() { Console.WriteLine("Consumer: Waiting for signal"); // 等待信号 evt.WaitOne(); Console.WriteLine("Consumer: Received signal"); // 模拟消费任务 Thread.Sleep(1000); Console.WriteLine("Consumer: Consumption Finished"); // 复位信号,供下次循环使用 evt.Reset(); } }
在这个示例中:
- Producer线程完成生产后,调用evt.Set()发送信号。
- Consumer线程在evt.WaitOne()等待信号。
- 收到信号后,Consumer完成消费任务。
- 在消费结束后,Consumer调用evt.Reset()复位信号,让生产-消费可以进行下一轮循环。
这个示例演示了ManualResetEvent的Set和Reset方法在线程间通信的示例用法。Set发送信号,Reset复位信号,实现生产者-消费者模式中的生产-消费-复位信号循环。