【发布时间】:2012-09-18 20:08:40
【问题描述】:
在 TPL 任务中处理异常时,我遇到了两种处理异常的方法。第一个捕获任务中的异常并在结果中返回它,如下所示:
var task = Task<Exception>.Factory.StartNew(
() =>
{
try
{
// Do Something
return null;
}
catch (System.Exception e)
{
return e;
}
});
task.ContinueWith(
r =>
{
if (r.Result != null)
{
// Handle Exception
}
});
第二个是文档中显示的,我猜是做事的正确方法:
var task = Task.Factory.StartNew(
() =>
{
// Do Something
});
task.ContinueWith(
r =>
{
if (r.Exception != null)
{
// Handle Aggregate Exception
r.Exception.Handle(y => true);
}
});
我想知道第一种方法是否有问题? 我使用这种技术时常收到“未处理的聚合异常”异常,想知道这是怎么发生的?
澄清一下,我认为第二种模式更好,但我有一大段代码使用第一种模式,我试图找出它是否需要重构,即如果事实证明不是全部异常会被捕获。
【问题讨论】:
-
我遇到了同样的问题,虽然我检查了 task.IsFaulted,但我发现如果它在任务期间出现异常,即使我做的第一件事是检查它,并注意到它并放弃,它仍然引起问题..我得到了一个不应该有的异常泄漏..
标签: c# .net task-parallel-library