AutoResetEvent 在以下两种情况下会重置:
以下是一个示例代码,演示了 AutoResetEvent 的使用和重置:
using System;
using System.Threading;
class Program
{
static AutoResetEvent autoResetEvent = new AutoResetEvent(false);
static void Main(string[] args)
{
// 创建两个线程,并启动
Thread t1 = new Thread(DoWork);
Thread t2 = new Thread(DoWork);
t1.Start();
t2.Start();
// 给线程一些时间来执行工作
Thread.Sleep(2000);
// 发送信号给一个等待的线程
autoResetEvent.Set();
// 给线程一些时间来执行工作
Thread.Sleep(2000);
// 再次发送信号给另一个等待的线程
autoResetEvent.Set();
// 等待线程执行完毕
t1.Join();
t2.Join();
}
static void DoWork()
{
Console.WriteLine("线程 {0} 正在等待信号...", Thread.CurrentThread.ManagedThreadId);
// 等待信号
autoResetEvent.WaitOne();
Console.WriteLine("线程 {0} 收到信号并继续执行...", Thread.CurrentThread.ManagedThreadId);
}
}
在上述示例中,有两个线程在等待 AutoResetEvent 的信号。当主线程发送信号后,其中一个线程会被唤醒,并继续执行。然后主线程再次发送信号,另一个线程会被唤醒。这个过程中,AutoResetEvent 会在每次唤醒线程后被重置为非终止状态。