【发布时间】:2015-07-04 18:49:07
【问题描述】:
使用 Parallel.ForEach 等并行化的最佳方法是什么,这样我可以快速迭代集合并将项目添加到新列表,而不会违反线程安全,而是使用多个服务器内核和大量 RAM 的性能增益?
public List<Leg> FetchLegs(Trip trip)
{
var result = new List<Leg>();
try
{
// get days
var days = FetchDays(trip);
// add each day's legs to result
Parallel.ForEach<Day>(days, day =>
{
var legs = FetchLegs(day);
result.AddRange(legs);
});
// sort legs by scheduledOut
result.Sort((x, y) => x.scheduledOut.Value.CompareTo(y.scheduledOut.Value));
}
catch (Exception ex)
{
SiAuto.Main.LogException(ex);
System.Diagnostics.Debugger.Break();
}
return result;
}
【问题讨论】:
-
当前形式的 result.AddRange(legs) 不是线程安全的,因为 List 不是线程安全的结构,请在并行循环中使用 ConcurrentQueue 之类的东西,可以使用 ToList() 将其转换为 List .否则并行代码看起来不错
标签: c# multithreading parallel-processing task-parallel-library .net-4.5