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