AutoResetEvent
是 C#
中的一个同步原语,用于在线程之间传递信号。当线程调用 AutoResetEvent
的 WaitOne
方法时,它会阻塞,直到另一个线程调用 Set
方法来释放它。一旦 WaitOne
方法返回,AutoResetEvent
将自动重置其状态,这意味着下一个调用 WaitOne
的线程将再次阻塞,直到 Set
被再次调用。
这是它的一个简单用途示例:
csharp
using System;
using System.Threading;
class Program
{
static AutoResetEvent autoEvent = new AutoResetEvent(false);
static void Main()
{
Thread thread1 = new Thread(DoWork);
thread1.Start();
// 等待一段时间,确保 thread1 已经开始执行并阻塞在 autoEvent.WaitOne();
Thread.Sleep(1000);
// 释放 thread1,使其继续执行
autoEvent.Set();
thread1.Join();
}
static void DoWork()
{
Console.WriteLine("Thread is waiting...");
autoEvent.WaitOne(); // 线程将在这里阻塞,直到 autoEvent.Set() 被调用
Console.WriteLine("Thread has been released and is now doing work...");
}
}
在上面的示例中,我们创建了一个 AutoResetEvent
实例并将其初始状态设置为 false
。然后,我们启动了一个新线程来执行 DoWork
方法。在这个方法中,线程调用 autoEvent.WaitOne()
并阻塞。主线程等待一段时间以确保 DoWork 方法已经开始执行并阻塞,然后调用 autoEvent.Set()
来释放它。一旦 Set
被调用,DoWork
方法中的 WaitOne
将返回,线程将继续执行并输出消息。
与 ManualResetEvent
不同,AutoResetEvent
在释放一个等待的线程后会立即重置,这意味着下一个调用 WaitOne
的线程将再次阻塞,直到 Set
被再次调用。而 ManualResetEvent
在没有显式调用 Reset
方法的情况下会保持其状态(无论是 true
还是 false
)。