如何捕获一系列任务的异常

时间:2016-03-23 21:00:49

标签: c# parallel-processing async-await task-parallel-library task

我想了解在尝试等待任务数组时我应该在“try”块中使用的内容。

我希望等待所有任务,无论其中一个是否抛出异常,以便它们都可以完成。

我应该使用:

var tasks = new Task<CasApiRouterModelExtendedInfo>[mbis.Length];

for (int i = 0; i < mbis.Length; i++)
{
    tasks[i] = CAS.Service.GetAllRouterInterfacesAsync(mbis[i], false, 2);
}

try
{
    Task.WaitAll(tasks);
}
catch (AggregateException ex)
{
    Trace.TraceError("Some interface discoveries failed: ");
    foreach (var innerEx in ex.InnerExceptions)
    {
        Trace.TraceError(innerEx.Message);
    }
}
foreach (var task in tasks)
{
    if (task.Status == TaskStatus.RanToCompletion && task.Result != null)
    {
        returnResults.Add(task.Result);
    }
}

OR

var tasks = new Task<CasApiRouterModelExtendedInfo>[mbis.Length];

for (int i = 0; i < mbis.Length; i++)
{
    tasks[i] = Task.Run(() => CAS.Service.GetAllRouterInterfacesAsync(mbis[i], true, 2));
}

try
{
    for (int i = 0; i < tasks.Length; i++)
    {
        tasks[i].Wait();
    }
}
catch (AggregateException ex)
{
    Trace.TraceError("Some interface discoveries failed: ");
    foreach (var innerEx in ex.InnerExceptions)
    {
        Trace.TraceError(innerEx.Message);
    }
}

foreach (var task in tasks)
{
    if (task.Status == TaskStatus.RanToCompletion && task.Result != null)
    {
        returnResults.Add(task.Result);
    }
}

此外,只要任务没有抛出异常,这个“task.Status == TaskStatus.RanToCompletion”是否返回true(这是检查这个方法的好方法)吗?

1 个答案:

答案 0 :(得分:2)

你有什么理由比较喜欢B吗?我想不出一个。

如果出现错误,B不正确。

另外,这是不好的风格。您的目的是等待所有任务,所以在代码中说出来。不需要手动循环来模糊你想要完成的任务。

  

此外,只要任务没有抛出异常,这个“task.Status == TaskStatus.RanToCompletion”是否返回true(这是检查这个方法的好方法)吗?

检查是否成功完成。可能,这就是你想要的。任务最终可能会被取消,但您可能会将其视为错误案例。

task.Result != null

这真的是你想要的吗?系统永远不会将task.Result设置为null。只有在GetAllRouterInterfacesAsync生成结果null时才会发生这种情况。