Home Full Site
CountdownEvent 클래스

ManualResetEvent가 한 쓰레드에서 신호(Signal)을 보내 복수 쓰레드들을 통제하는데 사용되는 반면, .NET 4.0에 소개된 CountdownEvent는 한 쓰레드에서 복수 쓰레드들로부터의 신호들을 기다리는데 사용된다. 아래는 10개의 쓰레드를 시작한 후, 이 쓰레드들로부터 처음 5개의 신호가 (CountdownEvent.Signal() 메서드) 먼저 도착하는 대로 메인쓰레드는 Wait 대기 상태를 해제하고 다음 문장을 실행하게 된다.

예제

using System;
using System.Threading;

namespace MultiThrdApp
{
    class Program
    {
        // CountdownEvent 객체 필드
        static CountdownEvent countEvent = new CountdownEvent(5);

        static void Main()
        {
            // 10개의 쓰레드 시작
            // 10개중 5개만 Vote만 끝내면 중지            
            for (int i = 0; i < 10; i++)
            {
                new Thread(Vote).Start(i);
            }

            // 메인쓰레드 첫 5개 신호를 기다림
            countEvent.Wait();

            Console.WriteLine("Vote is done!");            
        }

        static void Vote(object id)
        {                        
            if (countEvent.CurrentCount > 0)
            {
                // CountdownEvent 신호. -1씩 카운트다운.
                countEvent.Signal();

                Console.WriteLine("{0}: Vote", id);
            }
            else
            {
                Console.WriteLine("{0}: No vote", id);
            }
        }
    }
}



© csharpstudy.com