如果失败则重新启动任务
Restarting task if it fails
如果失败,我正在尝试重新启动多个任务之一。我正在使用 .ContinueWith(t => { HandleException(t); }, TaskContinuationOptions.OnlyOnFaulted);
,其中 HandleException(t)
方法应该在现有任务数组中找到任务并在其位置创建一个新任务。只有传递给我的 HandleException(t)
方法的任务与原始任务不同,所以我无法在现有任务中找到它。此外,在处理异常时,现有任务仍然是 运行。
示例:
using System;
using System.Threading.Tasks;
using System.Threading;
static Task[] tasks;
static void Main(string[] args)
{
tasks = new Task[2];
for (int i = 0; i < tasks.Count(); i++)
{
tasks[i] = Task.Run(() => { Thread.Sleep(1000); throw new Exception("BOOM"); })
.ContinueWith(t => { HandleException(t); }
, TaskContinuationOptions.OnlyOnFaulted);
Console.WriteLine(String.Format("Task {0} started", tasks[i].Id));
}
Console.ReadLine();
}
static void HandleException(Task task)
{
Console.WriteLine(String.Format("Task {0} stopped", task.Id));
// Check task status
for (int i = 0; i < tasks.Count(); i++)
{
Console.WriteLine(String.Format("Task {0} status = {1}", i, tasks[i].Status));
}
// fFind and restart the task here
if (tasks.Contains(task))
{
int index = Array.IndexOf(tasks, task);
tasks[index] = Task.Run(() => { Thread.Sleep(1000); throw new Exception("BOOM"); })
.ContinueWith(t => { HandleException(t); }
, TaskContinuationOptions.OnlyOnFaulted);
Console.WriteLine(String.Format("Task {0} started", tasks[index].Id));
}
}
我的申请结果:
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
由于传递给HandleException(t)
的任务与原来的任务不同,在tasks[]
中找不到,因此不会重新启动。还要查看 tasks[]
的状态,它尚未停止。我怎样才能正确地重新开始我的任务?
那是因为你在数组中存储了后续任务,而不是原始任务(即 - 你存储了 ContinueWith
的结果)。要修复,请改为存储原始任务:
var task = Task.Run(() => { Thread.Sleep(1000); throw new Exception("BOOM");});
task.ContinueWith(t => { HandleException(t); }
, TaskContinuationOptions.OnlyOnFaulted);
tasks[i] = task;
如果失败,我正在尝试重新启动多个任务之一。我正在使用 .ContinueWith(t => { HandleException(t); }, TaskContinuationOptions.OnlyOnFaulted);
,其中 HandleException(t)
方法应该在现有任务数组中找到任务并在其位置创建一个新任务。只有传递给我的 HandleException(t)
方法的任务与原始任务不同,所以我无法在现有任务中找到它。此外,在处理异常时,现有任务仍然是 运行。
示例:
using System;
using System.Threading.Tasks;
using System.Threading;
static Task[] tasks;
static void Main(string[] args)
{
tasks = new Task[2];
for (int i = 0; i < tasks.Count(); i++)
{
tasks[i] = Task.Run(() => { Thread.Sleep(1000); throw new Exception("BOOM"); })
.ContinueWith(t => { HandleException(t); }
, TaskContinuationOptions.OnlyOnFaulted);
Console.WriteLine(String.Format("Task {0} started", tasks[i].Id));
}
Console.ReadLine();
}
static void HandleException(Task task)
{
Console.WriteLine(String.Format("Task {0} stopped", task.Id));
// Check task status
for (int i = 0; i < tasks.Count(); i++)
{
Console.WriteLine(String.Format("Task {0} status = {1}", i, tasks[i].Status));
}
// fFind and restart the task here
if (tasks.Contains(task))
{
int index = Array.IndexOf(tasks, task);
tasks[index] = Task.Run(() => { Thread.Sleep(1000); throw new Exception("BOOM"); })
.ContinueWith(t => { HandleException(t); }
, TaskContinuationOptions.OnlyOnFaulted);
Console.WriteLine(String.Format("Task {0} started", tasks[index].Id));
}
}
我的申请结果:
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
由于传递给HandleException(t)
的任务与原来的任务不同,在tasks[]
中找不到,因此不会重新启动。还要查看 tasks[]
的状态,它尚未停止。我怎样才能正确地重新开始我的任务?
那是因为你在数组中存储了后续任务,而不是原始任务(即 - 你存储了 ContinueWith
的结果)。要修复,请改为存储原始任务:
var task = Task.Run(() => { Thread.Sleep(1000); throw new Exception("BOOM");});
task.ContinueWith(t => { HandleException(t); }
, TaskContinuationOptions.OnlyOnFaulted);
tasks[i] = task;