ThreadPool.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引发的血案,线程池异步非正确姿势导致程序闪退的问题的更多相关文章
- 线程池 异步I/O线程 <第三篇>
在学习异步之前先来说说异步的好处,例如对于不需要CPU参数的输入输出操作,可以将实际的处理步骤分为以下三步: 启动处理: 实际的处理,此时不需要CPU参数: 任务完成后的处理: 以上步骤如果仅仅使用一 ...
- C# 线程池异步调用
许多应用程序使用多个线程,但这些线程经常在休眠状态中耗费大量的时间来等待事件发生.其他线程可能进入休眠状态,并且仅定期被唤醒以轮询更改或更新状态信息,然后再次进入休眠状态.为了简化对这些线程的管理,. ...
- 转载 线程池 异步I/O线程 <第三篇>
在学习异步之前先来说说异步的好处,例如对于不需要CPU参数的输入输出操作,可以将实际的处理步骤分为以下三步: 启动处理: 实际的处理,此时不需要CPU参数: 任务完成后的处理: 以上步骤如果仅仅使用一 ...
- ThreadPool线程池的几种姿势比较
from multiprocessing.pool import ThreadPool #from multiprocessing.dummy import Pool as ThreadPool #这 ...
- Android AsyncTask内部线程池异步执行任务机制简要分析
如下分析针对的API 25的AsyncTask的源码: 使用AsyncTask如果是调用execute方法则是同步执行任务,想要异步执行任务可以直接调用executeOnExecutor方法,多数情况 ...
- Java ExecutorServic线程池(异步)
相信大家都在项目中遇到过这样的情况,前台需要快速的显示,后台还需要做一个很大的逻辑.比如:前台点击数据导入按钮,按钮后的服务端执行逻辑A,和逻辑B(执行大量的表数据之间的copy功能),而这时前台不能 ...
- 高并发场景-请求合并(二)揭秘HystrixCollapser-利用Queue和线程池异步实现
背景 在互联网的高并发场景下,请求会非常多,但是数据库连接池比较少,或者说需要减少CPU压力,减少处理逻辑的,需要把单个查询,用某些手段,改为批量查询多个后返回. 如:支付宝中,查询"个人信 ...
- java 线程池——异步任务
一.简单粗暴的线程 最原始的方式,当我们要并行的或者异步的执行一个任务的时候,我们会直接使用启动一个线程的方式,如下面所示: new Thread(new Runnable() { @Override ...
- Thrift的C++服务端(线程池和非阻塞)模式
非阻塞模式 #include "RpcServiceHandler.h" #include <thrift/concurrency/ThreadManager.h> # ...
随机推荐
- WINDOWS java 不能正常卸载 问题, (其他系统问题 也可以试试)
1.JAVA 原安装包无法卸载 不知道 有没有通知 碰到过这种情况的 自己碰到过3次这种情况了, 卸载不掉, 在网上 找了N多中 方法, 注册表什么的都被翻烂了, 单还是没用,其中有一次还把 ...
- 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多
通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无 ...
- JSON数据解析及gson.jar包
从服务器端接收数据的时候,那些数据必须以浏览器能够理解的格式来发送. 服务器端的编程语言只能以如下 3 种格式返回数据: HTML XML JSON JSON一种简单的数据格式,比xml更轻巧. JS ...
- hdu 5288||2015多校联合第一场1001题
pid=5288">http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a ar ...
- Jena将owl文件持久化到数据库中
package cn.edu.shu.db; import java.io.File; import java.io.FileInputStream; import java.io.IOExcepti ...
- JavaScript实现八大内部排序算法
注:基数排序中:r是关键字的基数,d是长度,n是关键字的个数 1.插入排序 基本思想:在序号i之前的元素(0到i-1)已经排好序,本趟需要找到i对应的元素x (此时即arr[i]) 的正确位置k,在寻 ...
- thymeleaf模板的使用(转)
作者:纯洁的微笑 出处:http://www.ityouknow.com/ 在上篇文章springboot(二):web综合开发中简单介绍了一下thymeleaf,这篇文章将更加全面详细的介绍thym ...
- MySQL必知必会笔记
数据库和表的增删改 创建数据库 CREATE DATABASE 数据库名; # mysql中还可使用如下语句 CREATE SCHEMA 数据库名; 数据库选择 USE 数据库名; 创建表 creat ...
- ES6模板字符串
ES6支持模板字符串,简单写法如下 //html界面 <!DOCTYPE html> <html> <head> <meta charset="ut ...
- less基础语法
变量 //->LESS代码 @link-color: #428bca; @link-color-hover: darken(@link-color, 10%); a { color: @link ...