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进程挂掉的原因,希望这次可以真正解决这个问题!

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:C#~异步编程再续~你必须要知道的ThreadPool里的throw,如需转载请自行联系原博主。

目录
相关文章
|
6月前
|
Java C#
C#学习系列相关之多线程(五)----线程池ThreadPool用法
C#学习系列相关之多线程(五)----线程池ThreadPool用法
|
6月前
|
C# 开发者
深入理解C#中的`Task<T>`:异步编程的核心
【1月更文挑战第3天】本文旨在探讨C#中`Task<T>`的使用和理解,作为异步编程模式的核心组件。`Task<T>`允许开发者在不阻塞主线程的情况下执行异步操作,并返回一个指定类型`T`的结果。通过定义返回`Task<T>`的异步方法、使用`async`和`await`关键字、处理异常以及获取任务结果,开发者可以编写出高效且响应迅速的应用程序。此外,本文还介绍了如何配置任务以及实现任务的连续性和组合,为掌握C#中的异步编程提供了全面的指导。
|
2月前
|
C# UED
C#一分钟浅谈:异步编程基础 (async/await)
在现代软件开发中,异步编程对于提升应用性能和响应性至关重要,尤其是在处理网络请求和文件读 异步编程允许程序在等待操作完成时继续执行其他任务,从而提高用户体验、高效利用资源,并增强并发性。在 C# 中,`async` 用于标记可能包含异步操作的方法,而 `await` 则用于等待异步操作完成。 示例代码展示了如何使用 `async` 和 `await` 下载文件而不阻塞调用线程。此外,本文还讨论了常见问题及解决方案,如不在 UI 线程上阻塞、避免同步上下文捕获以及正确处理异常。
52 0
|
6月前
|
C#
29.C#关键字throw初步学习
29.C#关键字throw初步学习
82 0
|
C#
C#异步编程
C#异步编程
184 0
|
C#
c#异步编程
c#异步编程原理,await asnyc的使用方法。异步编程是指在程序执行过程中,不需要等待某个操作完成,就可以继续执行后续的代码。
300 0
|
C#
C#网络应用编程,实验七: 异步编程练习
C#网络应用编程,实验七: 异步编程练习
120 1
C#网络应用编程,实验七: 异步编程练习
|
C#
C#网络应用编程,异步编程基础练习
C#网络应用编程,异步编程基础练习
147 1
C#网络应用编程,异步编程基础练习
|
SQL 开发框架 .NET
C#5.0-原生异步编程方式
微软提供的最新的异步编程基础设施。它允许我们以模块化的方式设计程序,来组合不同的异步操作。
115 0
C#5.0-原生异步编程方式
|
Java .NET C#
C#并发编程之异步编程(线程讨论)
C#并发编程之异步编程(线程讨论)写在前面本篇是异步编程系列的第三篇,本来计划第三篇的内容是介绍异步编程中常用的几个方法,但是前两篇写出来后,身边的朋友总是会有其他问题,所以决定在续写一篇,作为异步编程(一)和异步编程(二)的补充。
1455 0