System.Threading.Tasks.Task 引起的 IIS 应用池崩溃

接口服务运行一段时间后,IIS应用池就会突然挂掉,事件查看日志,会有事件日志Event ID为5011的错误

为应用程序池“PokeIn”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“2268”。数据字段包含错误号。

image

最后直接程序池直接被禁用

应用程序池“PokeIn”将被自动禁用,原因是为此应用程序池提供服务的进程中出现一系列错误。

查看管理事件

image

Application Error

错误应用程序名称: w3wp.exe,版本: 7.5.7601.17514,时间戳: 0x4ce7a5f8

错误模块名称: KERNELBASE.dll,版本: 
6.1.7601.17514,时间戳: 0x4ce7bafa

异常代码: 0xe0434352
错误偏移量: 0x0000b727
错误进程 ID: 0xc1c
错误应用程序启动时间: 0x01d045ca298f9b3c
错误应用程序路径: C:\Windows\SysWOW64\inetsrv\w3wp.exe
错误模块路径: C:\Windows\syswow64\KERNELBASE.dll
报告 ID: eb60afd0
-b1bd-11e4-9f2d-005056a934bb

.NET Runtime

Application: w3wp.exe Framework Version: v4.0.30319

Description: The process was terminated due to an unhandled exception.
Exception Info: System.AggregateException
Stack:
   at System.Threading.Tasks.TaskExceptionHolder.Finalize()

初步排查代码确定有可能的几点

1.项目中使用了dapper ,使用了using,跟踪了源码发现已经有对连接池的处理

int flagNum = new SqlConnection(DBSetting.XXX).Execute("SPS_BookForApp", param, commandType: CommandType.StoredProcedure);

 2.由之前的委托异步改为基于任务Task的异步

Func<string, string> func = f =>
            {
                if (!string.IsNullOrEmpty(orderNo) &&orderNo.IsPositiveInt())
                {
                    //记录订单量
                }
                else
                {
                    return string.Empty;
                }
            };
            func.BeginInvoke("Logging Order Data", ir =>
            {
                var ar = (AsyncResult)ir;
                var fun = (Func<string, string>)ar.AsyncDelegate;
                string returnValue = fun.EndInvoke(ir);
                if (!string.IsNullOrEmpty(returnValue))
                {
                    //判断是否记录成功
                }
            }, null);

改为

Task.Factory.StartNew(() =>
                        {
                            //
                        })

没有去捕获异常,想起之前看过的dudu说过这样的问题 ,于是修改了下

var task = Task.Factory.StartNew(() =>
{
    throw new MyCustomException("Task1 faulted.");
})
.ContinueWith((t) =>
 {
        Console.WriteLine("I have observed a {0}", t.Exception.InnerException.GetType().Name);
},  TaskContinuationOptions.OnlyOnFaulted);

现运行良好。

Refer:
Exception Handling (Task Parallel Library)
https://msdn.microsoft.com/en-us/library/dd997415.aspx
http://www.cnblogs.com/dudu/archive/2012/04/05/task_unhandled_exception_application_crash.html
Exception Handling with the Task Parallel Library
http://www.ademiller.com/blogs/tech/2010/10/exception-handling-with-the-task-parallel-library/
Exception while running system threading tasks task
http://stackoverflow.com/questions/15804059/exception-while-running-system-threading-tasks-task
http://stackoverflow.com/questions/7883052/a-tasks-exceptions-were-not-observed-either-by-waiting-on-the-task-or-accessi/7883083

 

转载于:https://www.cnblogs.com/Irving/p/4288450.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
System.Threading.Tasks是一个命名空间,提供了用于创建和管理任务的类和方法。它的作用是通过任务的概念来解决线程处理的复杂问题。任务(Task)包含一个操作,以及依赖哪个任务的完成才能开始。在使用System.Threading.Tasks时,可以使用Task类来创建和执行任务,使用Task.ContinueWith方法来定义任务之间的依赖关系,使用Task.WaitAll方法来阻塞调用任务,直到等待的所有任务完成为止,使用Task.WhenAll方法返回一个任务,允许使用async关键字等待结果,而不会阻塞等待任务。此外,还可以使用Task.Delay方法来指定从这个方法返回的任务完成前要等待的毫秒数。\[2\]在使用System.Threading.Tasks时,可以使用async和await关键字来简化异步编程的代码,使代码更加清晰和易于理解。\[3\] #### 引用[.reference_title] - *1* [C#任务Task应用详解](https://blog.csdn.net/weixin_36609037/article/details/126541489)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [.NET 4.0 System.Threading.Tasks学习笔记](https://blog.csdn.net/weixin_34223655/article/details/85449464)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [System.Threading.Tasks](https://blog.csdn.net/weixin_30699831/article/details/96191950)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值