2013-12-17 75 views
2

我有一個方法:任務並行庫異常句柄「任務已取消」。

var taskCount = Task<List<Client>>.Factory.StartNew(() => 
          { 

return ClientRepository.GetListAll(); 
          }).LogExceptions<Client>(); 
count = taskCount.Result; 

我有擴展方法爲LogException爲:

public static Task<T> LogExceptions<T>(this Task<T> task) where T : new() 
     { 
      return task.ContinueWith<T>((antecedent) => 
      { 
       bool isError = false; 
       var aggException = antecedent.Exception.Flatten(); 
       foreach (var exception in aggException.InnerExceptions) 
       { 
        isError = true; 
        LogWrite.LogStep(" Task Exception - ", exception.Message); 
       } 
       if (isError) 
       { 
        return new T(); 
       } 
       else 
       { 
        return antecedent.Result; 
       } 
      }, 
      TaskContinuationOptions.OnlyOnFaulted); 
     } 

上面的代碼工作,如果發生任何異常精細,它處理異常和預防工作進程從關閉它下降。

但是,當沒有錯誤時,它只是返回聚合異常作爲「任務被取消」。不知道我在上面的代碼中做錯了什麼。

如果上面的代碼是錯誤的,那麼以通用的方式處理任務中異常的最佳方法是什麼。

+0

你能檢查聚合異常的內部異常嗎? – daryal

回答

5

問題是您的TaskContinuationOptions選擇OnlyOnFaulted在繼續。每MSDN,OnlyOnFaulted指示只有在前面的任務拋出未處理的異常時纔會發生延續。由於在所有情況下都沒有發生異常情況,因此延續工作無法正常進行。嘗試省略TaskContinuationOptions參數或使用默認枚舉值None

+0

啊,我知道了..謝謝@ledButter你救了我的一天..一切工作正常,如果我刪除了TaskContinuationOption,它也有道理..至少我對TaskContinuationOption的理解現在已經清楚了......高五:) –

+0

不能投票你的答案,因爲我需要15名聲望,我是新來這個社區。但它確實是一個很好的答案,我相信有很多人可能會遇到像我這樣的問題。沒有人在堆疊交換中解釋過它,或者可能是在發佈此問題之前我沒有找到任何搜索結果...您是最好的.. –