2015-12-15 14 views
3

我有一個大名單(1000以上),我使用Parallel.Foreach循環,但我得到這個異常:並行的foreach大名單拋出異常

System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at
System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) at
System.Threading.Tasks.Task.Wait()

請讓我知道爲什麼我得到這個例外,並給我一個解決方案,以及如何提高並行性能foreach

var results = new List<BO>(); 
var localLockObject = new object(); 

Parallel.ForEach(
    emails, 
() => new List<BO>(), (email, state, localList) => 
    { 
     var item = new BO(); 
     localList.Add(item.Validate(email)); 
     return localList; 
    }, 
    finalResult => { lock (localLockObject) results.AddRange(finalResult); } 
); 
+1

你肯定是異常被拋出在哪裏?你可以點擊「[複製異常詳細信息到剪貼板](http://blogs.msdn.com/b/saraford/archive/2008/08/07/did-you-know-you-can-copy-the-exception-詳細信息 - 一鍵從異常 - 助理-276.aspx)「併發布全文作爲您的問題的編輯?這也會讓我們看到任何內部的異常或與之相關的消息。 –

回答

3

Parallel.ForEach聲明似乎很好,我不知道這是產生異常的地方。

然而,對於這種使用情況下更好的解決辦法是使用 PLINQ,不會要求同步:

var result = emails.AsParallel() 
        .Select(email => 
        { 
         var item = new BO(); 
         return item.Validate(email); 
        }).ToList(); 
+0

我應用您的解決方案,但我得到另一個錯誤: – KaKa

+0

@KaKa什麼是錯誤信息? –

+0

請在下面閱讀評論,這太長了,我可以插入到這裏 – KaKa