2013-07-19 156 views
2

什麼TaskContinuationOptions.OnlyOnFaulted VS嘗試捕捉

var task3 = Task.Run(() => PerformLongTask()).ContinueWith(t => Log.Error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); 

var task3 = Task.Run(() => PerformLongTask()); 

private void PerformLongTask() 
{ 
    try 
    { 
    //...... 
    } 
    catch (Exception ex) 
    { 
    Log.Error(ex); 
    } 
} 

我試圖運行這兩個例子之間的差異。從表面上看,他們表現得一樣。

一種方法比另一種更好嗎?

+1

不在此片段中,假設Log類是線程安全的。您傾向於在UI線程上進行延續,以便將問題報告給用戶。然後它很重要。 –

回答

1

在這種情況下,它們是相同的。但是,如果您不擁有「PerformLongTask」的內部功能,則無法將其內容封裝在試用版中。此外,即使它引發異常,任務的狀態也會以這種方式設置爲RanToCompletion。如果你有任務的延續,它將不得不處理可能沒有有效結果的先行任務。

我想它的缺點是,在前一種情況下,您的異常處理邏輯包含在一個單獨的任務中,與其他任務分離。