AutoResetEvent
是 C# 中一種非常有用的同步原語,它允許一個或多個線程等待某個條件成立
System.Threading
命名空間。using System.Threading;
AutoResetEvent
實例。你可以通過調用 new AutoResetEvent(false)
來創建一個初始狀態為未觸發的 AutoResetEvent
。參數 false
表示事件在創建時處于未觸發狀態。你也可以傳遞一個布爾值作為初始狀態,如果傳遞 true
,則表示事件在創建時處于已觸發狀態。AutoResetEvent autoResetEvent = new AutoResetEvent(false);
WaitOne()
方法來阻塞線程,直到事件被觸發。這個方法會釋放一個線程的鎖,讓其他線程可以繼續執行。當事件被觸發時,WaitOne()
方法會返回 true
,并且重新設置事件的初始狀態為未觸發。如果事件未被觸發,WaitOne()
方法會阻塞線程,直到事件被觸發。autoResetEvent.WaitOne(); // 阻塞線程,等待事件被觸發
Set()
方法來設置事件的狀態為已觸發。這個方法會釋放所有等待該事件的線程的鎖,讓它們可以繼續執行。autoResetEvent.Set(); // 觸發事件,喚醒等待的線程
下面是一個簡單的示例,展示了如何使用 AutoResetEvent
來同步兩個線程:
using System;
using System.Threading;
class Program
{
static AutoResetEvent autoResetEvent = new AutoResetEvent(false);
static void Main()
{
Thread t1 = new Thread(ThreadMethod1);
Thread t2 = new Thread(ThreadMethod2);
t1.Start();
t2.Start();
t1.Join();
t2.Join();
}
static void ThreadMethod1()
{
Console.WriteLine("Thread 1: Waiting for event...");
autoResetEvent.WaitOne(); // 阻塞線程,等待事件被觸發
Console.WriteLine("Thread 1: Event triggered.");
}
static void ThreadMethod2()
{
Thread.Sleep(1000); // 讓線程 1 先執行
Console.WriteLine("Thread 2: Triggering event...");
autoResetEvent.Set(); // 觸發事件,喚醒等待的線程
}
}
在這個示例中,ThreadMethod1
會阻塞等待 AutoResetEvent
被觸發,而 ThreadMethod2
在休眠 1 秒后觸發事件。當事件被觸發時,ThreadMethod1
會繼續執行。