ManualResetEvent
是 C# 中的一個同步原語,它允許一個或多個線程等待,直到另一個線程設置事件。ManualResetEvent
有兩種狀態:Set
和 Reset
。當事件處于 Set
狀態時,等待的線程會被釋放;當事件處于 Reset
狀態時,線程需要繼續等待。
下面是一個使用 ManualResetEvent
實現同步的示例:
using System;
using System.Threading;
class Program
{
static ManualResetEvent _event = new ManualResetEvent(false); // 初始狀態為 False
static void Main()
{
Thread producer = new Thread(Produce);
Thread consumer = new Thread(Consume);
producer.Start();
consumer.Start();
producer.Join();
consumer.Join();
}
static void Produce()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("生產者生產了 {0}", i);
_event.Set(); // 設置事件,喚醒等待的線程
Thread.Sleep(1000); // 模擬生產過程
}
_event.Reset(); // 重置事件,等待消費者線程
}
static void Consume()
{
while (true)
{
_event.WaitOne(); // 等待事件被設置
Console.WriteLine("消費者消費了");
Thread.Sleep(1000); // 模擬消費過程
}
}
}
在這個示例中,我們創建了一個生產者線程和一個消費者線程。生產者線程生產五個產品,并在每次生產后設置 ManualResetEvent
事件。消費者線程等待事件被設置,然后消費產品。當生產者線程完成生產后,它將事件重置為 False
,消費者線程需要繼續等待。