我是靠谱客的博主 勤恳玫瑰,这篇文章主要介绍ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题...,现在分享给大家,希望可以做个参考。

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// // 摘要: // 将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。 // // 参数: // 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);

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

编码测试过程

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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引发内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部