CountdownEvent

Shapley發表於2024-10-20

CountdownEvent是一種同步結構,主要用來協調多種同步處理後的結果場景使用。其含義為:定義一個多訊號的結構,然後在應用時判斷訊號是否全部到達,如果全部到達則繼續往下執行,否則進行阻塞,有意思的是,如果阻塞已過,那麼再次執行到wait()時,執行緒是不會再次阻塞的,除非呼叫reset()重新初始化後才可以。這點和其餘的同步結構不一樣。

示例如下:

internal class Program
{
    static CountdownEvent e = new CountdownEvent(3);
    static bool isOutput = true;

    static int i = 0;
    static void Main(string[] args)
    {
        Thread t = new Thread(ProcessData);
        t.Start();

        Console.WriteLine("啟動");
        i++;

        Console.WriteLine("訊號1已到");
        e.Signal();
        Console.WriteLine("訊號2已到");
        e.Signal();
        Console.WriteLine("訊號3已到");
        e.Signal();

        Console.ReadLine();
        i++;
        Console.WriteLine("訊號1又到");
        e.Signal();
        Console.WriteLine("訊號2又到");
        e.Signal();
        Console.WriteLine("訊號3又到");
        e.Signal();

        Console.ReadKey();

    }
    static void ProcessData()
    {
        while (isOutput)
        {
            Console.WriteLine("阻塞等待訊號");
            e.Wait();
            Console.WriteLine("阻塞已過,處理:Processed {0}", i);
            e.Reset();
            if (i > 1)
            {
                isOutput = false;
            }
        }
        if (!isOutput)
        {
            e.Dispose();
            Console.WriteLine("處理完成");
        }
    }

}

執行結果: