0

我正在使用扇出模式来执行可能失败的任务列表。所以我使用重试策略重试几次。现在,如果 SaveActivity 在最后一次重试后失败,那么它会掉入 catch 块,我会丢失成功的任务。

有没有办法,我可以过滤掉上次尝试后失败的任务,然后继续使用成功的列表?

是否可以在活动中进行重试尝试,以便我可以抑制异常并标记实体?

List<Task<AssetSyncResult>> tasks = modeList.
    Select(r => context.CallActivityWithRetryAsync<AssetSyncResult>("SaveActivity", new RetryOptions(TimeSpan.FromSeconds(20),3), r)).
    ToList();
try{
    AssetSyncResult[] syncResults = await Task.WhenAll(tasks);
} catch(Exception e){
    //rescue the workflow
}    

更新 1:

我不明白为什么反对票?

从任务中获取结果是不行的。从 Task.WhenAll 抛出的异常中恢复后,控件永远不会到达检查任务状态的过滤器。这是我更改代码的方式:

try
{
    AssetSyncResult[] syncResults = await Task.WhenAll(tasks);
}
catch (System.Exception)
{

}

List<AssetSyncResult> resultsPassed = tasks.Where(r => r.IsCompleted).Select(r => r.Result).ToList();
List<AssetSyncResult> resultsFailed = tasks.Where(r => r.IsFaulted).Select(r => r.Result).ToList();
4

2 回答 2

1

如果要获取失败函数的消息列表,请使用:

List<AssetSyncResult> resultsFailed = tasks.Where(r => r.IsFaulted).Select(r => r.Exception.Message).ToList();
于 2019-10-29T20:18:37.593 回答
0

最后,我通过吞下 Task.WhenAll 抛出的异常,然后运行过滤器来获取已成功的任务,从而完成了这项工作。在我之前的尝试中,我试图获取失败的任务,但我意识到这是一种不正确的方法。我们应该获取成功的任务,然后计算失败的任务。

这是我的代码的样子

try
{
    AssetSyncResult[] syncResults = await Task.WhenAll(tasks);
}
catch (System.Exception)
{

}

var passedResults = tasks.Where(r => r.Status == TaskStatus.RanToCompletion).Select(r => r.Result).ToList();
于 2019-01-04T12:05:01.403 回答