下面是我在 Parrrllel.Foreach 中使用的代码。但它与正常的 foreach 花费的时间相同。这里的filingDataItems、nonPeriodic、periodiccells都是数据表。发生这种情况是由于数据表吗?
System.Threading.Tasks.Parallel.ForEach(tempfilingReferences, T2 =>
{
Filing f = new Filing(
T2.Id,
T2.DocumentPeriod,
T2.FilingDate,
T2.VersionId,
T2.DocumentId,
T2.PrimaryPeriodTypeId,
T2.IssuedAsPreliminaryFlag,
T2.IssuedAsAmendmentFlag,
T2.FilingDetails,
T2.CompanyId,
GetFilingDataItems(filingDataItems, T2.Id, nonPeriodic, periodiccells, filingToPeriodList, DPTPList, posList),
GetPeriods(filingToPeriodList, periodInfoList, T2.Id),
GetFilingToPeriods(filingToPeriodList, T2.Id),
true,
false,
AuditedDataType.Financials,
T2.FilingTypeList
);
lock (filingListnew)
{
filingListnew.Add(f);
}
});
最佳答案
您正在锁定平行部分。 因此,您在每个线程中等待事件线程移除锁。 所以这与顺序 foreach 几乎相同。
例如:
并行.Foreach:
周期1
线程1:filingListnew.Add(Object1);
线程2:已锁定
线程3:已锁定
线程4:已锁定
周期2
线程1:已锁定
线程2:filingListnew.Add(Object2);
线程3:已锁定
线程4:已锁定
周期3 ...
“正常”foreach:
周期1
主线程:filingListnew.Add(Object1);
周期2
主线程:filingListnew.Add(Object2);
周期3 ...
正如您在示例中所看到的,您无法通过使用 ParallelForeach 的方式获得性能。
关于c# - Parallel.Foreach 比 C# 中的普通 foreach 花费更多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28540178/