C# ManualResetEvent狀態(tài)改變?nèi)绾瓮ㄖ?/h1>
c#
小樊
81
2024-10-12 08:07:58

ManualResetEvent 是 C# 中的一個(gè)同步原語(yǔ),用于讓一個(gè)或多個(gè)線程等待,直到另一個(gè)線程調(diào)用 Set 方法來(lái)重置事件的狀態(tài)。你可以通過(guò)以下方式通知等待的線程 ManualResetEvent 的狀態(tài)已經(jīng)改變:

  1. 使用 Set 方法:當(dāng)另一個(gè)線程完成其任務(wù)并需要通知等待的線程時(shí),它應(yīng)該調(diào)用 ManualResetEventSet 方法。這將設(shè)置事件的內(nèi)部狀態(tài)為 true,從而喚醒所有正在等待該事件的線程。
ManualResetEvent mres = new ManualResetEvent(false);

// 線程1:等待事件
mres.WaitOne(); // 這將阻塞線程1,直到mres被設(shè)置為true

// 線程2:設(shè)置事件并通知線程1
mres.Set(); // 這將喚醒線程1
  1. 使用 Pulse 方法(可選):如果你只想喚醒一個(gè)等待的線程,而不是所有等待的線程,你可以使用 Pulse 方法。這與 Set 方法類似,但它只喚醒一個(gè)線程。如果調(diào)用 Pulse 時(shí)沒(méi)有線程正在等待,那么事件的狀態(tài)不會(huì)改變。
ManualResetEvent mres = new ManualResetEvent(false);

// 線程1:等待事件
bool isAwoken = mres.WaitOne(0); // 這將阻塞線程1,直到mres被設(shè)置為true或超時(shí)

// 線程2:設(shè)置事件并通知線程1
if (isAwoken)
{
    mres.Pulse(); // 這將喚醒一個(gè)正在等待的線程(在這個(gè)例子中是線程1)
}

注意:在使用 ManualResetEvent 時(shí),請(qǐng)確保在適當(dāng)?shù)臅r(shí)候調(diào)用 Reset 方法,以便將事件的狀態(tài)重置為 false。否則,等待的線程可能會(huì)永遠(yuǎn)阻塞。

mres.Reset(); // 這將把mres的狀態(tài)重置為false

0