type
Post
status
Published
date
Sep 6, 2023
slug
c-sharp-async-task-exception
summary
C#异步编程-14 Task 的异常
tags
C#
CS
category
学习记录
icon
password
Property
Aug 9, 2024 11:59 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属性,那么该异常就被认为是“已观察到的”
- 作者:Kitety
- 链接:https://www.kitety.com/article/c-sharp-async-task-exception
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章


.png?table=block&id=fa81f9ab-c0da-4f4e-a935-0567380c36d0&t=fa81f9ab-c0da-4f4e-a935-0567380c36d0&width=1080&cache=v2)
.png?table=block&id=55df38cd-a361-41ee-a75d-c17615e78d6b&t=55df38cd-a361-41ee-a75d-c17615e78d6b&width=1080&cache=v2)
_(1).jpg?table=block&id=a716c7ee-7105-4a3f-8133-a15129086419&t=a716c7ee-7105-4a3f-8133-a15129086419&width=1080&cache=v2)
.jpg?table=block&id=2e9784d9-1d6e-44fc-9106-f0c576ddcb8f&t=2e9784d9-1d6e-44fc-9106-f0c576ddcb8f&width=1080&cache=v2)

.png?table=block&id=c0772cdb-ee08-49f4-b2f3-c804586bb769&t=c0772cdb-ee08-49f4-b2f3-c804586bb769&width=1080&cache=v2)

.png?table=block&id=b43ea4ae-a57d-4962-80ba-12280979702b&t=b43ea4ae-a57d-4962-80ba-12280979702b&width=1080&cache=v2)
