重试失败的任务列表

时间:2018-07-06 19:31:18

标签: c# task

我正在尝试创建一个函数,该函数在并非所有任务通过时都处理任务列表的重试逻辑。该函数当前如下所示:

private async Task<List<T>> CompleteOperationsWithRetry<T>(List<Task> toComplete, int maxRetries)
{
    var completedTasks = new List<Task>();
    var failedTasks = new List<Task>();

    await Task.WhenAll(toComplete.ToArray());
    foreach (var task in toComplete)
    {
        // if task didn't complete add to failed list
        if (!task.IsCompleted)
        {
            failedTasks.Add(task);
            continue;
        }
        // add task to appropriate list depending on whether or not failed
        var list = task.IsFaulted ? failedTasks : completedTasks;
        list.Add(task);        
    }
    toComplete = failedTasks;

   // Desired: repeat code above while toComplete is not empty


   // ... eventually return completed tasks
   return completedTasks;
}

我想遍历toComplete并将所有失败的任务添加到failedTasks列表中,然后我希望它能够再次通过类似于Task.WhenAll()的函数调用来运行。但是,我读到,一旦Task处于完成状态,就无法重新运行它。如何从现有失败的任务创建新任务,以便重新运行它?

1 个答案:

答案 0 :(得分:0)

Task实际上并不知道它是如何开始的。只是持有某物的完成状态的对象。

“某事”不一定是您通过将委托传递给Task.Run来启动的后台任务。可能完全是另外一回事。您可以创建任意Task实例,并控制何时将其标记为已完成/已故障/已取消(请参见TaskCompletionSource)。

因此,仅凭Task就无法做到这一点。您必须创建自己的对象,该对象知道如何启动每个任务,并将其传递给自己,然后要求其重新启动。