【发布时间】:2011-07-11 13:19:10
【问题描述】:
我有问题。
在另一个 Parallel.ForEach 中使用 Parallel.Invoke 有什么好处吗?
这是我的代码:
Parallel.ForEach(yearMonths,
() => new List<DJVSStatsCo>(),
(yearMonth, loopState, localDjvsStatsCo) =>
{
var coVintageCounter = 0;
var coExitsCounter = 0;
var coExtant = 0;
Parallel.Invoke(() =>
coVintageCounter = globalData.ValuationEventsPit.
Where(x => x.FirstRoundYearMonth <= yearMonth).
Select(x => x.CompanyId).Distinct().Count(),
() =>
coExitsCounter = globalData.ValuationEventsPit.
Where(x => x.ExitDate != null && x.ExitDateYearMonth == yearMonth).
Select(x => x.CompanyId).Distinct().Count(),
() =>
coExtant = globalData.ValuationEventsPit.
Where(x => x.FirstRoundYearMonth <= yearMonth && (x.ExitDate == null || x.ExitDateYearMonth > yearMonth)).
Select(x => x.CompanyId).Distinct().Count()
);
localDjvsStatsCo.Add(new DJVSStatsCo(yearMonth, coVintageCounter, coExtant, coExitsCounter));
return localDjvsStatsCo;
},
x =>
{
lock (locker)
{
djvsStatsCos.AddRange(x);
}
});
我有大约 50K 条记录,我的机器有 2 个核心处理器,计算计算时间我得到几乎相同的结果。所以我的问题是在 Parallel 中使用 Parallel 有什么好处吗?这方面的最佳做法是什么?
非常感谢。
真诚地, 弗拉德。
【问题讨论】:
-
如果您在两种情况下都获得相同的吞吐量,那么没有理由使用
Parallel.Invoke使代码复杂化。换句话说,如果 less 并行已经使 CPU 饱和,你不会因为使 more 并行而获得奖励积分......有时你甚至会失去积分!
标签: c# .net multithreading parallel-processing task-parallel-library