• C#多线程开发处理异步操作中的异常


    C#多线程开发-处理子线程中的异常

    在平时的多线程开发中,对于异常的处理是至关重要的,千万不能马虎。如果在实际的项目中,对于某些线程中的异常没有处理,会直接导致整个程序崩溃,软件无法使用。

    其中需要说明的是,在子线程中产生的异常是无法在主线程被捕获到,也就是你即使在使用线程方法外有try/catch也无济于事,线程中的异常只能在线程中捕获并处理。

    比如下面的例子,可以看到在创建线程的代码是在try/catch中的,按照常理来说,如果子线程中有异常发生那么外部的try/catch是可以正常收到异常通知的。

            static void Main(string[] args)
            {
                try
                {
                    Thread tempThread = new Thread(Test); 
                    tempThread.Start();
                } 
                catch (Exception ex)
                {
                    Console.WriteLine("" + ex.Message);
                }
            }
    
            private static void Test()
            {
                Thread.Sleep(100);
    
                for (int i = 0; i < 100; i++)
                {
                    Console.WriteLine("" + i);
                    if (i == 10)
                    {
                        throw new Exception("触发异常" + i);
                    }
                }
            }
    

    运行上面的代码,可以看到程序无法在外部通过try/catch方法接收到异常,运行后软件会直接异常到子线程中,无法把异常在次往出抛。以后我们在使用线程/异步(也是一种特殊的线程)时要特别的留心。

    然而正确的做法是在子线程中捕获并处理异常。把程序进行修改,下面就可以正确捕获到异常信息。

            private static void Test()
            {
                Thread.Sleep(100);
                try
                {
                    for (int i = 0; i < 100; i++)
                    {
                        Console.WriteLine("" + i);
                        if (i == 10)
                        {
                            throw new Exception("触发异常" + i);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("捕获的子线程中的异常信息:"+ex.Message);
                }            
            }
    

    看下面图片,程序就在子线程中捕获到了异常信息。

    小寄语

    人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

    原创不易,给个关注。

    我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发 谢谢。

  • 相关阅读:
    struts2中<s:select>标签的使用
    正则表达式(括号)、[中括号]、{大括号}的区别小结
    解读邮箱正则表达式:^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$
    Struts2国际化-getText()方法
    Eclipse的Tomcat热部署,免重启的方法
    hdu 5056Boring count
    纸板上的虚拟现实和代码中的Cardboard
    OC-Protocol实现业务代理
    UVA 11237
    mysql相关日志汇总
  • 原文地址:https://www.cnblogs.com/netxiaohui/p/15857719.html
Copyright © 2020-2023  润新知