1

先行タスクの成功または失敗に基づいて実行する必要がある一連のタスクを作成しています。ただし、先行タスクが実行されないにもかかわらず、タスクの 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 タスクが実行されているのはなぜですか?

4

2 に答える 2

2

追加する必要があると思います

TaskContinuationOptions.OnlyOnRanToCompletion

それ以外の場合は公正なゲームであり、失敗または実行された場合にのみ順次実行されます。

私はこれを使用しましたが、あなたが望むように反応したようです。

var calcTask = saveTask.ContinueWith(task =>
{
     Console.WriteLine("calc");
}, TaskContinuationOptions.OnlyOnRanToCompletion);
于 2013-07-31T04:32:38.777 に答える
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");
}, TaskContinuationOptions.OnlyOnRanToCompletion);

var errorTask = importTask.ContinueWith(task =>
{
    Console.WriteLine("error");
    Console.WriteLine(task.Exception.InnerException.Message);
}, TaskContinuationOptions.OnlyOnFaulted);

例外をスローしないためTaskContinuationOptions.NotOnFaulted、 onを使用しても機能しません。TaskContinuationOptions.OnlyOnRanToCompletion を使用して、適切に実行された場合にのみ実行するように指定する必要があります。に関する詳細情報は次のとおりです。calcTasksaveTaskcalcTasksaveTaskTaskContinuationOptions

http://msdn.microsoft.com/en-us/library/ee372288.aspx

于 2013-07-31T04:46:52.077 に答える