Долговечные функции: получение невыполненных задач в шаблоне Fan out - PullRequest
0 голосов
/ 04 января 2019

Я использую шаблон разветвления для выполнения списка задач, которые могут потерпеть неудачу.Поэтому я использую стратегию повтора, чтобы повторить попытку пару раз.Прямо сейчас, если 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();

1 Ответ

0 голосов
/ 04 января 2019

Наконец-то у меня получилось: проглотил исключение, выданное 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();
...