2017-08-11 65 views
0

我有一個奇怪的情況下,我無法找到我的錯誤的根源以下堆棧跟蹤:布爾包括任務取消的異常而在C#做Parallel.Foreach

Message :One or more errors occurred.<br/> 
StackTrace : at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 
    at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) 
    at System.Threading.Tasks.Task.Wait() 
    at System.Threading.Tasks.Parallel.ForWorker[TLocal](Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Func`4 bodyWithLocal, Func`1 localInit, Action`1 localFinally) 
    at System.Threading.Tasks.Parallel.For(Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body) 

代碼本身是有一些邏輯簡單明瞭Parallel.Foreach循環像下面:

Parllel.Foreach(_collection, new ParallelOptions { MaxDegreeOfParallelism =5 }, item=> 
{ 
// code inside 
}); 

可能是什麼這個問題的根源?你們有什麼提示給我,我應該在哪裏尋找?

@mortb這是我的日誌堆棧跟蹤異常:

string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\Error.txt"; 

      using (StreamWriter writer = new StreamWriter(filePath, true)) 
      { 
       writer.WriteLine("Message :" + ex.Message + "<br/>" + Environment.NewLine + "StackTrace :" + ex.StackTrace + 
        "" + Environment.NewLine + "Date :" + DateTime.Now.ToString()); 
       writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine); 
      } 
+0

調試,並採取一看拋出的異常屬性'InnerExceptions'(注意'InnerExceptions'的S)外的例外是剛剛超過一個的包裝或幾個拋出異常通過''// code inside''「,實際的異常被列在'InnerExceptions'中 – mortb

+0

@mortb這就是我的錯誤..我無法將異常寫入文本文件...等待我將顯示你我如何記錄錯誤.. – User987

+0

@mortb你能看到我更新的問題嗎?這就是我如何登錄異常本身...有沒有什麼辦法可以記錄內部異常本身並查看哪條線會拋出它? – User987

回答

1

建議更改日誌:

string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\Error.txt"; 

using (StreamWriter writer = new StreamWriter(filePath, true)) 
{ 
     foreach(var inner in (ex as AggregateException).?InnerExceptions ?? (new [] {ex})) 
     { 
      writer.WriteLine("Message :" + inner.Message + "<br/>" + Environment.NewLine + "StackTrace :" + inner.StackTrace + 
      "" + Environment.NewLine + "Date :" + DateTime.Now.ToString()); 
      writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine); 
     } 
} 
+0

Mortb,非常感謝你!要現在嘗試代碼:) – User987

+0

它說的前。不包含名爲InnerExceptions的屬性,而只是一個名爲「InnerException」的單值形式的屬性 – User987

+0

可能你已經發現異常爲catch(Exception ex),然後它已經失去了它的類型,我添加了代碼將它轉換爲AggregateException (未測試)代碼不是最佳的,但它可能工作 – mortb

1

// code inside拋出一個異常。你看到的例外是Parallel.For循環,它的工作任務正常關閉。通常,ForEach函數應該在最後引發異常,以確定錯誤的實際原因。您看到的錯誤看起來像調試器觸發ForEach函數的內部異常。

+0

非常感謝您的回覆!我更新了我最初的問題,我如何登錄異常本身...有什麼辦法可以記錄內部異常本身? – User987

+0

異常的類型應該是'AggregateException'。如果你投射到這一個,你會得到一個屬性'InnerExceptions'(注意「s」)。此列表中的一個例外是您正在查找的那個例外。 – Nitram