C#~异步编程再续~你必须要知道的ThreadPool里的throw

问题依旧存在

之前写过相关文章异步编程的文章,本文主要还是一点补充,之前在IIS经常发w3wp进程无做挂了的情况,但一直没能找到真正的原因,而查找相关资料,找了一些相关的文章,如await和async引起的线程死锁,也都进行了分析,但和我们项目的情况有些不同,因为在我们项目里只用了ThreadPool和Task.Run这种线程池,而异步用了也是异步到底的

今天无意中看到一个文章,说到了在ThreadPool中如果出现异常,并且你没有捕捉它,直接throw了,这时也会引用w3wp进程的死掉,我在电脑上试了一下,确实有这种情况,于是很兴奋!

在事件查看器里的截图

最后将我的线程池方法进行了改良,解决了这个问题

优化后的代码

复制代码
   /// <summary>
    /// 线程管理
    /// </summary>
    public class ThreadManager
    {
        /// <summary>
        /// 将在线程池上运行的指定工作排队
        /// </summary>
        /// <param name="action"></param>
        public static void Run(Action action)
        {
            ThreadPool.QueueUserWorkItem(u =>
            {
                try
                {
                    action();
                }
                catch (Exception ex)
                {
                    Lind.DDD.Logger.LoggerFactory.Instance.Logger_Error(ex);
                }
            });

        }

    }
复制代码

下面我自己做了一个测试,在.net里的4种开启新线程的方式,及它们是否会引起w3wp服务挂掉,做了一个对比,请看代码

复制代码
      ThreadPool.QueueUserWorkItem((o) =>//w3wp会有挂机问题
            {
                var b = 0;
                var c = 1 / b;
            });

            Task.Run(() => //不会有挂机问题
            {
                var b = 0;
                var c = 1 / b;
            });

            new Thread(() =>//w3wp会有挂机问题
            {
                var b = 0;
                var c = 1 / b;

            }).Start();


            Task.Factory.StartNew(() =>//不会有挂机问题
            {
                var b = 0;
                var c = 1 / b;
            });
复制代码

最后,很高兴找到又一个引起w3wp进程挂掉的原因,希望这次可以真正解决这个问题!

 

posted @   张占岭  阅读(1232)  评论(3编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2012-05-18 Redis学习笔记~把redis放在DATA层,作为一种数据源,我认为更合理,也更符合我的面向对象原则
2012-05-18 Redis学习笔记~五大数据结果的测试
2011-05-18 LINQ TO SQL的ORM模型构架,实现DATA层的方法!
2011-05-18 一个用户实体应该有它自己的实体验证,即一个实体应该有它的属性,方法,扩展属性及验证机制组成
2011-05-18 变色的导航
2011-05-18 再说说静态构造函数
2011-05-18 图像的等比例缩放
点击右上角即可分享
微信分享提示