Task异常处理的坑

Posted jionsoft

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Task异常处理的坑相关的知识,希望对你有一定的参考价值。

全局异常

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异常处理的坑的主要内容,如果未能解决你的问题,请参考以下文章

汇总开发过程中遇到的坑

异常和TCP通讯

WPF异常捕获三种处理 UI线程, 全局异常,Task异常

如何处理 Task.Run 异常

C# -Task.Run() 中线程池中的索引超出范围异常

编写高质量代码改善C#程序的157个建议——建议86:Parallel中的异常处理