码迷,mamicode.com
首页 > 其他好文 > 详细

Task异常处理的坑

时间:2020-06-22 01:37:22      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:runtime   AMM   blank   get   +=   ros   ddd   调用   exception   

全局异常

TaskScheduler.UnobservedTaskException += (e, args) =>{
  MessageBox.Show("dddddddddddddddd");
};

即便有个Task发生了未处理的异常,也不会立即触发这个事件,而是那个Task必须被GC回收时才会触发,如果那儿task一直被引用,那么它一直无法触发

所以我们可以手动调用GC.Collect();,但这样也不一定行

经过测试,.net 4.0中程序必须是release模式才有效,而.net 4.5 debug或release都行

完整测试代码如下:

TaskScheduler.UnobservedTaskException += (eeee, args) =>
{
    MessageBox.Show("sssssssssssss");
};

Task.Run(() => {
     throw new Exception("aa");
});

Thread.Sleep(2000);
GC.Collect();

发生未处理异常时阻止程序退出

vs2019 .net 4.0中、4.5测试发生未处理task异常时 并不会像未处理线程异常那样程序退出,可以在配置中做如下配置:

<runtime>
    <ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>

这样发生未处理的task异常后 程序会退出。

无论如何,TaskScheduler.UnobservedTaskException事件还是会触发,但是前提条件上面已经讲过了

剩下的task异常处理看官网文档就行了

Task异常处理的坑

标签:runtime   AMM   blank   get   +=   ros   ddd   调用   exception   

原文地址:https://www.cnblogs.com/jionsoft/p/13174589.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!