AutoResetEvent
是 C# 中的一個同步原語,它提供了一種方式讓一個或多個線程等待,直到另一個線程發出信號為止。AutoResetEvent
的功能類似于互斥鎖(Mutex),但它們在使用上有一些不同之處。
以下是 AutoResetEvent
的主要功能:
AutoResetEvent
可以用于控制多個線程之間的執行順序。當一個線程調用 WaitOne()
方法時,它會阻塞,直到另一個線程調用 Set()
方法發出信號。這樣,您可以確保在給定時間內只有一個線程能夠訪問共享資源。ManualResetEvent
不同,AutoResetEvent
在發出信號后會自動將狀態重置為未觸發狀態。這意味著,當線程 A 調用 Set()
方法后,線程 B 可以立即調用 WaitOne()
方法并獲得信號,而無需再次調用 Set()
。AutoResetEvent
支持多個線程之間的同步。當多個線程調用 WaitOne()
方法時,它們會按照調用順序獲得信號。一旦一個線程獲得信號,其他線程將繼續等待,直到輪到它們。AutoResetEvent
還可以用于跨進程通信。您可以在一個進程中創建一個 AutoResetEvent
,并在另一個進程中使用 Set()
和 WaitOne()
方法與其進行同步。以下是一個簡單的 AutoResetEvent
示例:
using System;
using System.Threading;
class Program
{
static AutoResetEvent are = new AutoResetEvent(false); // 創建一個未觸發的 AutoResetEvent
static void Main()
{
Thread t1 = new Thread(new ThreadStart(ThreadMethod1));
Thread t2 = new Thread(new ThreadStart(ThreadMethod2));
t1.Start();
t2.Start();
t1.Join();
t2.Join();
}
static void ThreadMethod1()
{
Console.WriteLine("Thread 1 waiting for AutoResetEvent...");
are.WaitOne(); // 等待 AutoResetEvent 被觸發
Console.WriteLine("Thread 1 has been signaled.");
}
static void ThreadMethod2()
{
Thread.Sleep(1000); // 讓線程 1 先運行一段時間
Console.WriteLine("Thread 2 setting the AutoResetEvent...");
are.Set(); // 觸發 AutoResetEvent
}
}
在這個示例中,線程 1 首先調用 WaitOne()
方法等待 AutoResetEvent
被觸發。線程 2 在一段時間后調用 Set()
方法發出信號。一旦線程 2 發出信號,線程 1 將繼續執行并輸出 “Thread 1 has been signaled.”。