耐用的功能:以扇出模式获得失败的任务

时间:2019-01-03 23:41:27

标签: c# azure-durable-functions

我正在使用扇出模式执行可能失败的任务列表。所以我正在使用重试策略来重试几次。现在,如果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();

2 个答案:

答案 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();