我下面的代碼:Parallel.ForEach丟失物品
HttpContext httpContext = HttpContext.Current;
RequestContext currentContext = RequestContextManager.CurrentContext;
ILifetimeScope currentSessionScope = PlatformContext.LifeTimeScope;
ConcurrentQueue<Exception> exceptions = new ConcurrentQueue<Exception>();
ConcurrentBag<ParallelCalculateObj> forEachResult = new ConcurrentBag<ParallelCalculateObj>();
ConcurrentBag<ParallelCalculateObj> testForEachPassResult = new ConcurrentBag<ParallelCalculateObj>();
ParallelLoopResult loopResult = Parallel.ForEach(applications,() =>
{
HttpContext.Current = httpContext;
RequestContextManager.SetCustomCurrentContext(currentContext);
PlatformContext.LifeTimeScope = currentSessionScope;
return new ParallelCalculateObj();
}, (application, pls, localObj) =>
{
try
{
// some code
}
catch (Exception e)
{
exceptions.Enqueue(e);
}
testForEachPassResult.Add(localObj);
return localObj;
}, forEachResult.Add);
其中applications.Count = 3
。執行上述代碼後,我得到forEachResult.Count = 2
和testForEachPassResult.Count = 3
爲什麼forEachResult集合不包含所有元素? 沒有例外,並且ParallelLoopResult.IsCompleted = true
。
一兩件事,可能會解決我的問題是有幫助的是,這三個項目是在兩個線程運行:
- Item01 - > Thread.CurrentThread.ManagedThreadId是14
- Item02 - > Thread.CurrentThread .ManagedThreadId是10
- Item03 - > Thread.CurrentThread.ManagedThreadId是14
非常感謝!但是,你能向我解釋什麼是使用localFinally部分的目的?我不能只是將項目添加到循環體中的集合? –
@MateuszPuwałowskilocalFinally將每個分區的結果合併爲一個最終值。以您的問題爲例:您有兩個分區,第一個分區包含Item01和Item03以及第二個Item02。這兩個本地列表包含處理Item01和Item03的結果以及Item02的結果。 localfinally步驟然後將這兩個列表合併成一個包含所有三個結果的列表。 – Dirk