C# ManualResetEvent怎樣實(shí)現(xiàn)線程同步

c#
小樊
81
2024-10-12 07:34:57

ManualResetEvent 是 C# 中用于線程同步的一個(gè)類(lèi)。它允許一個(gè)或多個(gè)線程等待,直到另一個(gè)線程設(shè)置事件。ManualResetEvent 有兩種狀態(tài):SetReset。當(dāng)事件處于 Set 狀態(tài)時(shí),等待的線程會(huì)被釋放;當(dāng)事件處于 Reset 狀態(tài)時(shí),線程需要繼續(xù)等待。

下面是一個(gè)使用 ManualResetEvent 實(shí)現(xiàn)線程同步的示例:

using System;
using System.Threading;

class Program
{
    static ManualResetEvent _event = new ManualResetEvent(false); // 創(chuàng)建一個(gè)初始值為 false 的 ManualResetEvent

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

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

        // 讓線程1完成工作后設(shè)置事件
        _event.Set();

        thread1.Join();
        thread2.Join();
    }

    static void DoWork()
    {
        Console.WriteLine("線程1開(kāi)始工作...");

        // 等待事件被設(shè)置
        _event.WaitOne();

        Console.WriteLine("線程1繼續(xù)工作...");
        Console.WriteLine("線程1完成工作...");
    }
}

在這個(gè)示例中,我們創(chuàng)建了兩個(gè)線程 thread1thread2,它們都執(zhí)行 DoWork 方法。在 DoWork 方法中,我們使用 _event.WaitOne() 讓線程等待事件被設(shè)置。在 Main 方法中,我們首先啟動(dòng)兩個(gè)線程,然后在適當(dāng)?shù)臅r(shí)候調(diào)用 _event.Set() 設(shè)置事件,以便線程可以繼續(xù)執(zhí)行。

需要注意的是,ManualResetEvent 在使用完后應(yīng)該被釋放。你可以在程序結(jié)束時(shí)調(diào)用 _event.Dispose() 方法來(lái)釋放事件。在上面的示例中,我們?cè)?thread1thread2 都完成后調(diào)用了 Join() 方法,確保主線程在所有子線程完成后才退出。這樣可以避免因?yàn)樽泳€程仍在運(yùn)行而導(dǎo)致資源無(wú)法釋放的問(wèn)題。

0