본문 바로가기
프로그래밍/C#.net

[C#] AutoResetEvent 와 ManualResetEvnet 예제

by 건우아빠유리남편 2009. 1. 15.
반응형

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace WaitHandleTest1
{
    class ThreadPlayer
    {
        private string m_name;  //이름
        private Random m_random;    //달리기속도를 다르게 하기 위한 Random
        //이벤트. 맨처음에 이벤트 발생이면 true 아님 false
        private ManualResetEvent m_event = new ManualResetEvent(false);
       // private AutoResetEvent m_event = new AutoResetEvent(false);

 

        public string Name
        {
            get { return m_name; }
        }

        public WaitHandle Event
        {
            get { return m_event; }
        }
 
        public ThreadPlayer(string name, int randomSeed)
        {
            m_name = name;
            m_random = new Random(randomSeed);
        }

        public void Run()
        {
            for (int progress = 10; progress <= 100; progress += 5)
            {
                Thread.Sleep(m_random.Next(100));
            }
            Console.WriteLine("{0} 선수가 도착했습니다", m_name);

            m_event.Set();

        }
    }

    class Program
    {
        const int MaxPlayer = 30;

        static void Main(string[] args)
        {
            Random seed = new Random();

            ThreadPlayer[] players = new ThreadPlayer[MaxPlayer];
            WaitHandle[] events = new WaitHandle[MaxPlayer];
          

            for (int i = 0; i < MaxPlayer; i++)
            {
                ThreadPlayer player =
                    new ThreadPlayer((i+1).ToString()+" 번",seed.Next(1000));
                events[i] = player.Event;
          
                //선수를 쓰레드로 만든다.
                Thread t = new Thread(new ThreadStart(player.Run));

                t.Start();

                //선수를 배열로 보관
                players[i] = player;
            }

            int winner = WaitHandle.WaitAny(events);
            Console.WriteLine(new string('-', 30));
            Console.WriteLine("{0} 선수가 일등입니다.", players[winner].Name);
            Console.WriteLine(new string('-', 30));

            events[4].WaitOne();

 

            Console.WriteLine(new string('-', 30));
            Console.WriteLine("기다리던 {0} 선수가 들어왔네.", players[4].Name);
            Console.WriteLine(new string('-', 30));

            WaitHandle.WaitAll(events);
            Console.WriteLine(new string('-', 30));
            Console.WriteLine("다 들어왔슈");
            Console.WriteLine(new string('-', 30));

            foreach (ManualResetEvent evt in events)
            {
                evt.Reset();
            }
        }
    }
}

반응형

댓글