2013-07-31 51 views
1

我寫應該執行的基礎上,先行任務的成功或失敗的任務序列。但是,其中一個任務意外執行,即使其先行任務未執行。ContinueWith任務意外執行

的步驟是,我輸入一些數據。如果成功,我開始保存,然後計算。如果導入失敗,我想處理異常。

這裏是我可以複製它的簡單代碼:

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。

爲什麼計算任務的執行?

回答

2

我相信你有

TaskContinuationOptions.OnlyOnRanToCompletion 

添加到每個後續項目,以確保它們不會在來路運行,以完成除運行,否則它是公平的遊戲,它只會按順序運行天氣失敗或運行。

我用這個,它似乎是你想要的迴應。

var calcTask = saveTask.ContinueWith(task => 
{ 
    Console.WriteLine("calc"); 
}, TaskContinuationOptions.OnlyOnRanToCompletion); 
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); 

calcTask使用TaskContinuationOptions.NotOnFaulted不會起作用,因爲saveTask不拋出任何異常。您必須使用TaskContinuationOptions.OnlyOnRanToCompletion指定,如果saveTask正確執行calcTask只應執行。你可以找到關於TaskContinuationOptions的更多信息:

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