ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题「建议收藏」

ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题「建议收藏」ThreadPool是.net System.Threading命名空间下的线程池对象。使用QueueUserWorkItem实现对异步委托的先进先出有序的回调。如果在回调的方法里面发生异常

大家好,又见面了,我是你们的朋友全栈君。

 ThreadPool是.net System.Threading命名空间下的线程池对象。使用QueueUserWorkItem实现对异步委托的先进先出有序的回调。如果在回调的方法里面发生异常则应用程序会出现闪退。当然是指不处理那个异常的情况下。这不公司的CMS在生产环境频频出现闪退的情况。该死的是,原来用老机器配置不高的情况下没有出现过。换了更好的新机器后出现的。

        //
        // 摘要:
        //     将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
        //
        // 参数:
        //   callBack:
        //     System.Threading.WaitCallback,它表示要执行的方法。
        //
        //   state:
        //     包含方法所用数据的对象。
        //
        // 返回结果:
        //     如果此方法成功排队,则为 true;如果未能将该工作项排队,则引发 System.NotSupportedException。
        //
        // 异常:
        //   T:System.NotSupportedException:
        //     承载公共语言运行时 (CLR) 的宿主不支持此操作。
        //
        //   T:System.ArgumentNullException:
        //     callBack 为 null。
        [SecuritySafeCritical]
        public static bool QueueUserWorkItem(WaitCallback callBack, object state);

经过一番测试重新了故障现象,但由于是生产环境代码不好大动,看来解决方案就是吞掉异常,让程序不再闪退一种解决办法了。

编码测试过程

using System;
using System.Threading;

namespace ConsoleShell3
{
    //164-184
    class Program
    {
        static object queueObj = new object();
        static CoreThreadPool pool = new CoreThreadPool();
        static void Main(string[] args)
        {            
            Console.WriteLine("Main Thread OK...");
            pool.Exceute += Pool_Exceute;
            pool.Start();
            pool.Post(queueObj);
            Thread thread = new Thread(() => 
            {
                while (true)
                {
                    Thread.Sleep(1000);
                    queueObj = (object)DateTime.Now.Ticks;
                    Console.WriteLine(DateTime.Now);
                    pool.Post(queueObj);
                }               
            });
            thread.Start();
            Console.ReadLine();
        }

        private static void Pool_Exceute(object obj)
        {
            ThreadPool.QueueUserWorkItem(CallbackDemoViod, obj);                      
        }

        /// <summary>
        /// 我的方案就是在这里把这个回调的方法用try catch包裹起来,吞到出现的异常
        /// </summary>
        /// <param name="obj"></param>
        private static void CallbackDemoViod(object obj)
        {
            try
            {
                var inObj = obj;
                var ex = new Exception("!!!!");
                throw ex;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            //以下不catch异常就会导致闪退
            //var inObj = obj;
            //var ex = new Exception("!!!!");
            //throw ex;
        }
    }
}

处理前后对比

处理前

ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题「建议收藏」

处理后

ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题「建议收藏」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154820.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 6种不同画法画平行线_「精品」漫画人物轮廓画法(精华版)「建议收藏」

    「教程」漫画人物脸部绘画基础part01脸部轮廓的画法(精修版)一、漫画线条与变形想要将人的脸或表情用自己的风格表现出来,需要抓住其特征,然后进行简单化、夸张化的变形,这是不可或缺的手段。在实际开始动笔画之前,关于如何变形要好好考虑清楚。01.简化主线用少量的线条画出角色的特征难度很高。刚开始练习的可以参考照片,拿真人的脸做练习,然后再逐步减少主线的线条,将画面简单化。①细碎的发丝归拢为…

  • redhat忘记root密码的解决办法_grub修改root密码

    redhat忘记root密码的解决办法_grub修改root密码转于lee的http://hi.baidu.com/maozilee/item/12a62a76f371df2bd7a89c5dRedFlagLinux忘记root密码解决办法Linux忘记root密码解决办法(进入Linux单用户系统修复模式)1.用RedFlag标准安装盘启动系统见http://blog.sina.com.cn/s/blog_8e5b82670101

  • centos7 安装mysql详细流程

    centos7 安装mysql详细流程工作中经常需要安装mysql,每次安装的时候,总是用不同的方法安装,有错误就解决一下,今天又重新装了一次mysql,记录下过程,以后就安装这种方式安装了!1、查看系统版本[root@test107vm14rpm-gpg]#lsb_release-aLSBVersion::core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4….

  • mysql基本总结

    mysql基本总结

  • 什么是关联数据[通俗易懂]

    什么是关联数据[通俗易懂]维基百科的定义在计算机领域,关联数据描述了一种发布结构化数据的方法,使得数据能够相互连接起来,便于更好的使用。中文权威期刊的定义关联数据是国际互联网协会(W3C)推荐的一种规范,用来发布和连接各类数据信息和知识。

  • eNSP安装步骤_ENSP常用命令

    eNSP安装步骤_ENSP常用命令今天工作需要安装ensp,记下步骤以便以后使用。1前期准备工作1.1下载并打开VirtualBox-5.2.26-128414-Win安装包,按向导安装完毕。1.2下载并打开WinPcap_4_1_3安装包,按照导示安装完毕1.3下载并打开Wireshark-win64-1.12.4安装包,按照导示完成安装2完成ensp的安装下载并安装eNSP_Setup,打开运行按照导示完成安装即…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号