zoukankan      html  css  js  c++  java
  • 等待一组同时开始的线程,并且捕捉子线程中的异常

            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

  • 相关阅读:
    618狂欢结束,来聊聊华为云GaussDB NoSQL的蓬勃张力
    用GaussDB合理管控数据资源的几点心得
    边缘计算告诉你们公司空调怎么开最省钱
    应对高并发,服务器如何笑而不“崩”
    父亲节程序员硬核示爱:你能看懂几条
    Spring Boot 之Spring data JPA简介
    将Spring Boot应用程序注册成为系统服务
    Spring Boot Admin的使用
    Spring Boot devtool的使用
    Spring Boot国际化支持
  • 原文地址:https://www.cnblogs.com/noigel/p/15266559.html
Copyright © 2011-2022 走看看