C# 다중 스레드가 모든 스레드가 끝날 때까지 기다리는 문제

8075 단어 다중 스레드
using System;

using System.Threading;



namespace ConsoleApplication1

{

    class Program

    {

        private static AutoResetEvent[] events;



        static void Main(string[] args)

        {

            int threadNum = 10;

            Thread[] thread = new Thread[threadNum];



            events = new AutoResetEvent[threadNum];



            for (int i = 0; i < threadNum; i++)

            {

                var waithandler = new AutoResetEvent(false);

                events[i] = waithandler;

                ThreadStart starter = delegate

                {

                    var param = new Tuple<string, AutoResetEvent>("test print:" + i, waithandler);

                    Print(param);

                };

                thread[i] = new Thread(starter)

                {

                    Name = "thread" + i.ToString()

                };

            }



            for (int i = 0; i < threadNum; i++)

            {

                thread[i].Start();

            }



            WaitHandle.WaitAll(events);

            Console.WriteLine("Completed!");

            Console.Read();



        }



        private static void Print(object param)

        {

            var p = (Tuple<string, AutoResetEvent>)param;

            Console.WriteLine(Thread.CurrentThread.Name + ": Begin!");

            Console.WriteLine(Thread.CurrentThread.Name + ": Print" + p.Item1);

            Thread.Sleep(300);

            Console.WriteLine(Thread.CurrentThread.Name + ": End!");

            p.Item2.Set();

        }

    }

}

한 번에 Set, 사실 ManualResetEvent를 사용하면 충분합니다.
using System;

using System.Collections.Generic;

using System.Threading;



namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            var waits = new List<EventWaitHandle>();

            for (int i = 0; i < 10; i++)

            {

                var handler = new ManualResetEvent(false);

                waits.Add(handler);

                new Thread(new ParameterizedThreadStart(Print))

                {

                    Name = "thread" + i.ToString()

                }.Start(new Tuple<string, EventWaitHandle>("test print:" + i, handler));

            }

            WaitHandle.WaitAll(waits.ToArray());

            Console.WriteLine("Completed!");

            Console.Read();



        }



        private static void Print(object param)

        {

            var p = (Tuple<string, EventWaitHandle>)param;

            Console.WriteLine(Thread.CurrentThread.Name + ": Begin!");

            Console.WriteLine(Thread.CurrentThread.Name + ": Print" + p.Item1);

            Thread.Sleep(300);

            Console.WriteLine(Thread.CurrentThread.Name + ": End!");

            p.Item2.Set();

        }



    }

}

좋은 웹페이지 즐겨찾기