我正在尝试创建一个函数,该函数在并非所有任务通过时都处理任务列表的重试逻辑。该函数当前如下所示:
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处于完成状态,就无法重新运行它。如何从现有失败的任务创建新任务,以便重新运行它?
答案 0 :(得分:0)
Task
实际上并不知道它是如何开始的。只是持有某物的完成状态的对象。
“某事”不一定是您通过将委托传递给Task.Run
来启动的后台任务。可能完全是另外一回事。您可以创建任意Task
实例,并控制何时将其标记为已完成/已故障/已取消(请参见TaskCompletionSource
)。
因此,仅凭Task
就无法做到这一点。您必须创建自己的对象,该对象知道如何启动每个任务,并将其传递给自己,然后要求其重新启动。