【问题标题】:What triggers finally throwing an AggregateException in WinForms?什么触发最终在 WinForms 中抛出 AggregateException?
【发布时间】:2012-11-14 16:24:49
【问题描述】:
当我怀疑Task 的Action 失败时,我曾经只是坐等AggregateException 最终被抛出,这样我就可以深入研究InnerException。然而,最近,我注意到通过尝试调整导致失败 Task 的表单的大小,我可以强制错误明显抛出。
两个问题:
- 有没有更好的方法来做到这一点? (我讨厌“将调用包装在 try/catch/re-
throw 中并在 re-throw 技术上设置断点)。
- 我认为
AggregateException 在Task 对象本身被垃圾回收时被抛出。这是真的吗?
- 根据第 2 条的答案:为什么调整大小会更立即触发
AggregateException?
【问题讨论】:
标签:
c#
winforms
task-parallel-library
【解决方案1】:
有没有更好的方法来做到这一点?
您可以使用Result 属性或Wait() 函数。两者都会阻塞,如果Task 失败,它们会抛出AggregateException。另一种选择,如果你想对异常做一些事情,是使用ContinueWith() 和TaskContinuationOptions.OnlyOnFaulted。
我认为当 Task 对象本身被垃圾收集时,会引发 AggregateException。这是真的吗?
是的,如果Task 的Exception 未被以任何方式访问,它会在.Net 4.0 上完成时抛出异常。 (.Net 4.5 改变了这一点,当 Task 最终确定时,来自 Tasks 的未处理异常不再抛出。)
根据第 2 条的答案:为什么调整大小会更立即触发 AggregateException?
很可能是因为它创建了一些对象,导致垃圾回收运行。