type
status
date
slug
summary
tags
category
icon
password
Property
Sep 7, 2023 11:56 AM

Task 的异常

与Thread不一样,Task可以很方便的传播异常
  • 如果你的task里面抛出了一个未处理的异常(故障),name该异常就会重新被抛出给:
    • 调用了Wait()的地方
    • 访问了Task<TResult>的Result属性的地方
    • (例子exception)
CLR将异常包裹在AggregateException里,以便在并行编程场景中发挥很好地作用
无需重新抛出异常,通过Task的IsFaulted和IsCanceled属性也可以检测出Task是否发生了故障
  • 如果两个属性都返回false,name没有错误发生
  • 如果IsCancel额的为true,那就说明一个OperationCanceledException为该Task抛出了。
  • 如果IsFaulted为true,那就说明另一个类型的异常被抛出了,而Exception属性也将指明错误

异常与“自治”的Task

自治的。“设置完就不管了”的Task。就是指不通过调用Wait()方法、Result属性或continuation进行会合的任务。
针对自治的Task,需要像Thread一样,显式的处理异常,避免发生“悄无声息的故障”
自治Task上未处理的异常称为未观察到的异常

未观察到的异常

可以通过全局的TaskScheduler.UnobservedTaskException来订阅未观察到的异常
关于什么是“未观察到的异常”,有一些细微的差别
  • 使用超时进行等待的Task,如果在超时后发生故障,那么他将会产生一个“为观察到的异常”
  • 在Task发生故障后,如果访问Task的Exception属性,那么该异常就被认为是“已观察到的”
C#异步编程-13 Task 的返回值C#异步编程-15 Coninuation
  • Waline
Kitety
Kitety
独特为佳
公告
我曾经七次鄙视自己的灵魂
--卡里·纪伯伦
第一次,当它本可进取时,却故作谦卑;
第二次,当它在空虚时,用爱欲来填充;
第三次,在困难和容易之间,它选择了容易;
第四次,它犯了错,却借由别人也会犯错来宽慰自己;
第五次,它自由软弱,却把它认为是生命的坚韧;
第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。
 
最新评论
Loading...