C# 继续执行意外执行的任务
我正在写一系列的任务,这些任务应该根据先前任务的成功或失败来执行。但是,其中一个任务意外执行,即使其前一个任务未执行 步骤是,我导入一些数据。如果成功,我将启动保存,然后进行计算。如果导入失败,我想处理异常 下面是我可以用的最简单的代码:C# 继续执行意外执行的任务,c#,.net,task-parallel-library,C#,.net,Task Parallel Library,我正在写一系列的任务,这些任务应该根据先前任务的成功或失败来执行。但是,其中一个任务意外执行,即使其前一个任务未执行 步骤是,我导入一些数据。如果成功,我将启动保存,然后进行计算。如果导入失败,我想处理异常 下面是我可以用的最简单的代码: var importTask = new Task(() => { Console.WriteLine("import"); // Force an exception throw new Exception("FAIL"); });
var importTask = new Task(() => {
Console.WriteLine("import");
// Force an exception
throw new Exception("FAIL");
});
var saveTask = importTask.ContinueWith(task => {
Console.WriteLine("save");
}, TaskContinuationOptions.NotOnFaulted);
var calcTask = saveTask.ContinueWith(task => {
Console.WriteLine("calc");
});
var errorTask = importTask.ContinueWith(task => {
Console.WriteLine("error");
Console.WriteLine(task.Exception.InnerException.Message);
}, TaskContinuationOptions.OnlyOnFaulted);
importTask.Start();
此操作的输出为:
进口
计算
错误
失败
我认为calcTask应该在saveTask之后执行。但是,即使saveTask不执行,它也会执行。有趣的是,在calcTask中,task.IsCanceled==true
为什么要执行计算任务?我相信您必须添加
TaskContinuationOptions.OnlyOnRanToCompletion
要确保它们不会运行,除非先决条件运行到完成,否则这是公平的游戏,无论它失败或运行,它都将按顺序运行
我用了这个,它看起来像你想要的那样反应
var calcTask = saveTask.ContinueWith(task =>
{
Console.WriteLine("calc");
}, TaskContinuationOptions.OnlyOnRanToCompletion);
使用以下命令:
var importTask = new Task(() =>
{
Console.WriteLine("import");
// Force an exception
throw new Exception("FAIL");
});
var saveTask = importTask.ContinueWith(task =>
{
Console.WriteLine("save");
}, TaskContinuationOptions.NotOnFaulted);
var calcTask = saveTask.ContinueWith(task =>
{
Console.WriteLine("calc");
}, TaskContinuationOptions.OnlyOnRanToCompletion);
var errorTask = importTask.ContinueWith(task =>
{
Console.WriteLine("error");
Console.WriteLine(task.Exception.InnerException.Message);
}, TaskContinuationOptions.OnlyOnFaulted);
在calcTask
上使用TaskContinuationOptions.notonfault
将不起作用,因为saveTask
不会引发任何异常。您必须使用TaskContinuationOptions.OnlyOnRanToCompletion来指定只有在正确执行saveTask
的情况下才应执行calcTask
。有关TaskContinuationOptions
的更多信息,请访问: