我正在使用扇出模式执行可能失败的任务列表。所以我正在使用重试策略来重试几次。现在,如果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引发的异常中恢复之后,控件再也不会进入检查Task状态的筛选器。这是我更改代码的方式:
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();
答案 0 :(得分:1)
如果要获取失败功能的消息列表,请使用:
List<AssetSyncResult> resultsFailed = tasks.Where(r => r.IsFaulted).Select(r => r.Exception.Message).ToList();
答案 1 :(得分: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();