C# 如果任务失败,则重新启动任务

C# 如果任务失败,则重新启动任务,c#,task,continuations,C#,Task,Continuations,如果失败,我将尝试重新启动多个任务中的一个。我正在使用.ContinueWith(t=>{HandleException(t);},TaskContinuationOptions.OnlyOnFaulted)其中HandleException(t)方法应在激励任务数组中找到任务,并在其位置创建一个新任务。只有传递给我的HandleException(t)方法的任务与原始任务不同,因此我无法在激励任务中找到它。此外,在处理异常时,激发任务仍在运行 例如: 由于传递给HandleException

如果失败,我将尝试重新启动多个任务中的一个。我正在使用
.ContinueWith(t=>{HandleException(t);},TaskContinuationOptions.OnlyOnFaulted)
其中
HandleException(t)
方法应在激励任务数组中找到任务,并在其位置创建一个新任务。只有传递给我的
HandleException(t)
方法的任务与原始任务不同,因此我无法在激励任务中找到它。此外,在处理异常时,激发任务仍在运行

例如:


由于传递给
HandleException(t)
的任务与原始任务不同,因此在
tasks[]
中找不到该任务,因此不会重新启动。同时查看
任务[]
尚未停止的状态。如何才能正确地重新启动任务?

这是因为您将继续任务存储在数组中,而不是原始任务(即,您将继续的结果存储在中)。若要修复,请改为存储原始任务:

var task = Task.Run(() => { Thread.Sleep(1000); throw new Exception("BOOM");});
task.ContinueWith(t => { HandleException(t); }
         , TaskContinuationOptions.OnlyOnFaulted);
tasks[i] = task;

太棒了,这的确是个问题。它还修复了任务状态。@Evk因为HandleException(t)是一个递归调用,它不会最终导致堆栈溢出吗?@MaximPodkolzin否,因为所有操作都发生在不同的线程上。新任务通过
task启动。Run
,这将从线程池捕获线程>引发异常>调用HandleException,可能会在不同的线程上再次调用
任务。Run
将再次调用,并从线程池捕获另一个线程(由于忙于执行HandleException,因此无法使用相同的线程)>当前线程完成执行并返回池。对于堆栈溢出,相同的线程应该递归地执行函数,但这里我们有不同的线程(因此堆栈也不同)。
Task 3 started
Task 6 started
Task 5 stopped
Task 0 status = Running
Task 2 stopped
Task 1 status = Running
Task 0 status = Running
Task 1 status = Running
var task = Task.Run(() => { Thread.Sleep(1000); throw new Exception("BOOM");});
task.ContinueWith(t => { HandleException(t); }
         , TaskContinuationOptions.OnlyOnFaulted);
tasks[i] = task;