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
的更多信息,请访问: