中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

C#學習之ManualResetEvent的理解和使用

c#
小億
130
2024-01-09 08:54:28
欄目: 編程語言

ManualResetEvent 是一個用于線程同步的類,它允許一個或多個線程等待,直到某個事件發生。它有兩個狀態:已觸發和未觸發。當事件處于未觸發狀態時,所有等待的線程將被阻塞,直到事件被手動觸發。當事件處于已觸發狀態時,等待的線程將被喚醒,繼續執行。

以下是 ManualResetEvent 的主要方法和屬性:

  • Set():將事件狀態設置為已觸發,喚醒所有等待的線程。
  • Reset():將事件狀態設置為未觸發。
  • WaitOne():等待事件的觸發,如果事件已經觸發,則立即返回;否則,線程將被阻塞,直到事件被觸發。
  • WaitOne(timeout):等待事件的觸發,如果事件已經觸發,則立即返回;否則,線程將被阻塞,直到事件被觸發或者超時。

以下是一個使用 ManualResetEvent 的示例:

using System;
using System.Threading;

class Program
{
    static ManualResetEvent manualResetEvent = new ManualResetEvent(false);

    static void Main(string[] args)
    {
        Thread thread1 = new Thread(Work);
        Thread thread2 = new Thread(Work);

        thread1.Start();
        thread2.Start();

        // 等待一段時間
        Thread.Sleep(2000);

        // 觸發事件,喚醒等待的線程
        manualResetEvent.Set();

        // 等待線程執行完畢
        thread1.Join();
        thread2.Join();

        Console.WriteLine("All threads completed.");
        Console.ReadLine();
    }

    static void Work()
    {
        Console.WriteLine("Thread {0} waiting.", Thread.CurrentThread.ManagedThreadId);

        // 等待事件的觸發
        manualResetEvent.WaitOne();

        Console.WriteLine("Thread {0} resumed.", Thread.CurrentThread.ManagedThreadId);
    }
}

在上面的示例中,我們創建了兩個工作線程 thread1 和 thread2,并且讓它們等待 manualResetEvent 事件的觸發。在主線程中,我們等待了 2 秒鐘后,手動觸發了 manualResetEvent 事件。這樣,兩個工作線程就被喚醒,繼續執行,并最終輸出 “All threads completed.”。

ManualResetEvent 在多線程編程中非常有用,可以實現線程之間的同步和協調。需要注意的是,一旦 ManualResetEvent 被觸發,它會一直保持觸發狀態,直到我們調用 Reset() 方法將其重置為未觸發狀態。

0
同仁县| 韶山市| 财经| 文水县| 手游| 曲麻莱县| 海丰县| 襄城县| 乌兰察布市| 平邑县| 新巴尔虎右旗| 修武县| 东光县| 双柏县| 北宁市| 利川市| 新源县| 曲沃县| 会昌县| 洛隆县| 鄱阳县| 新乡市| 建始县| 宿松县| 高唐县| 涡阳县| 五河县| 鄢陵县| 晋城| 甘肃省| 新邵县| 铁力市| 略阳县| 桂平市| 金坛市| 黄龙县| 广昌县| 仁布县| 启东市| 麟游县| 邵武市|