温馨提示×

c#中manualresetevent怎么使用

小亿
117
2023-07-08 18:54:44
栏目: 编程语言

在C#中,ManualResetEvent是一种同步原语,用于控制多个线程之间的同步。

使用ManualResetEvent的基本步骤如下:

  1. 创建一个ManualResetEvent对象:
ManualResetEvent manualResetEvent = new ManualResetEvent(false); // 初始状态为非终止状态
  1. 在需要等待的线程中调用WaitOne方法等待信号:
manualResetEvent.WaitOne(); // 线程将在这里等待,直到接收到信号
  1. 在发送信号的线程中调用Set方法发送信号:
manualResetEvent.Set(); // 发送信号,唤醒等待的线程
  1. 在需要重置信号的时候,可以调用Reset方法将ManualResetEvent重置为非终止状态:
manualResetEvent.Reset(); // 重置为非终止状态

完整示例代码如下:

using System;
using System.Threading;
class Program
{
static ManualResetEvent manualResetEvent = new ManualResetEvent(false);
static void Main(string[] args)
{
// 创建线程并启动
Thread t1 = new Thread(DoWork);
Thread t2 = new Thread(DoWork);
t1.Start();
t2.Start();
// 等待一段时间后发送信号
Thread.Sleep(2000);
Console.WriteLine("Sending signal...");
manualResetEvent.Set();
// 等待线程完成
t1.Join();
t2.Join();
Console.WriteLine("Done");
Console.ReadLine();
}
static void DoWork()
{
Console.WriteLine("Thread {0} waiting...", Thread.CurrentThread.ManagedThreadId);
manualResetEvent.WaitOne(); // 线程将在这里等待,直到接收到信号
Console.WriteLine("Thread {0} resumed", Thread.CurrentThread.ManagedThreadId);
}
}

这个示例中,创建了两个线程t1和t2,并且启动它们。然后,主线程等待2秒后发送信号给ManualResetEvent,两个子线程在调用WaitOne方法时都会被阻塞,直到接收到信号后才会继续执行。最后,主线程等待两个子线程完成后输出"Done"。

0