先行タスクの成功または失敗に基づいて実行する必要がある一連のタスクを作成しています。ただし、先行タスクが実行されないにもかかわらず、タスクの 1 つが予期せず実行されます。
手順は、いくつかのデータをインポートすることです。それが成功したら、保存を開始してから計算を開始します。インポートが失敗した場合は、例外を処理したいと考えています。
これを再現できる最も簡単なコードは次のとおりです。
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();
これからの出力は次のとおりです。
輸入
計算
エラー
不合格
saveTask の後に calcTask を実行するべきだと思いました。ただし、saveTask が実行されなくても実行されます。興味深いことに、calcTask 内では、task.IsCanceled == true です。
calc タスクが実行されているのはなぜですか?