我正在编写应根据先前任务的成功或失败执行的任务序列。但是,其中一项任务意外执行,即使其先前的任务没有执行。
步骤是,我导入一些数据。如果成功,我会开始保存,然后进行计算。如果导入失败,我想处理异常。
这是我可以重现的最简单的代码:
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。
为什么执行 calc 任务?