等待一组同时开始的线程,并且捕捉子线程中的异常

        static  void Main(string[] args)
        {
            List<ManualResetEvent> manualEvents = new List<ManualResetEvent>();
            for(int i=0;i<3;i++)
            {
                ManualResetEvent mre = new ManualResetEvent(false);
                manualEvents.Add(mre);
                Param para = new Param() { mre = mre, Para = i + 1 };
                //ThreadPool.QueueUserWorkItem(ThreadMethod, para);
                ThreadPool.QueueUserWorkItem(state =>
                {
                    try
                    {
                        ThreadMethod(para);
                    }
                    catch (Exception ex)
                    {

                        OnEx(ex);
                    }
                });
            }
            WaitHandle.WaitAll(manualEvents.ToArray());
            Console.WriteLine("Hit any key to continue");
            Console.ReadKey();
            
        }
    public class Param
    {
        public ManualResetEvent mre;
        public int Para;
    }
        private static void OnEx(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        private static void ThreadMethod(object state)
        {
            Param para = (Param)state;
            for (int i = 0; i < 7; i++)
            {
                Console.WriteLine("In thread  " + para.Para);
                if (i == 4)
                    throw new Exception("HAHA");
                Thread.Sleep(1000);
            }
            para.mre.Set();
        }

方法二;使用Task.Run

    public class Param { 
        public int Para;
    }


//in calling thread
           List<Task> tasks = new List<Task>();
            for(int i=0;i<3;i++)
            {
                Param para = new Param()
                {
                    Para = i + 1
                };
                tasks.Add(Task.Run(() =>
                {
                    ThreadMethod(para);
                }));
            }
            try
            {
                Task.WaitAll(tasks.ToArray());
            }
            catch (AggregateException ex)
            {

                //throw ex.Flatten();
            }
            Console.WriteLine("Hit any key to continue");




        private static void ThreadMethod(object state)
        {
            Param para = (Param)state;
            for (int i = 0; i < 7; i++)
            {
                Console.WriteLine("In thread  " + para.Para);
                if (i == 4)
                    throw new Exception("HAHA");
                Thread.Sleep(1000);
            }

        }

 More On:

https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/exception-handling-task-parallel-library?redirectedfrom=MSDN

原文地址:https://www.cnblogs.com/noigel/p/15266559.html