是的,C#中的ManualResetEvent類支持重入。ManualResetEvent是一個同步原語,用于在多線程環境中控制對共享資源的訪問。它有兩個主要操作:等待(Wait)和設置(Set)。
當一個線程調用ManualResetEvent的Wait方法時,它會阻塞,直到另一個線程調用Set方法。當Set方法被調用后,所有等待該事件的線程將被釋放。
關于重入,ManualResetEvent的Wait方法可以安全地在同一個線程中多次調用。每次調用Wait方法,線程都會釋放事件并進入等待狀態。當事件被Set后,線程將被喚醒并重新嘗試獲取事件。這種機制允許同一個線程多次等待同一個事件,而不會導致死鎖或其他同步問題。
以下是一個簡單的示例:
using System;
using System.Threading;
class Program
{
static ManualResetEvent _event = new ManualResetEvent(false);
static void Main()
{
Thread thread1 = new Thread(Thread1);
Thread thread2 = new Thread(Thread2);
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
}
static void Thread1()
{
_event.WaitOne(); // 線程1等待事件
Console.WriteLine("Thread 1 executed.");
_event.Set(); // 設置事件,喚醒等待的線程
}
static void Thread2()
{
_event.WaitOne(); // 線程2等待事件
Console.WriteLine("Thread 2 executed.");
_event.Set(); // 設置事件,喚醒等待的線程
}
}
在這個示例中,兩個線程可以安全地等待和設置同一個ManualResetEvent實例,而不會導致死鎖或其他同步問題。