我尝试对大量实体执行迭代,以查看它们的匹配程度
我最初写道 (其中MatchData是结构列表,并且GenerateMatch对两个实体执行操作)for (int i = 0; i < count; i++)
{
for (int j = i + 1; j < count; j++)
{
MatchData.Add(GenerateMatch(i, j));
Console.WriteLine("Stage :" + i + " ::: " + j);
}
}
工作正常,但很慢
所以我把它改成了
Parallel.For(0, count, i =>
{
for (int j = i + 1; j < count; j++){
MatchData.Add(GenerateMatch(i, j));
Console.WriteLine("Stage :" + i + " ::: " + j);
}});
折扣,这将给我一个巨大的列表,它偶尔(但不总是)抛出一个错误&#39;容量小于当前的大小&#39;
对并行库而言是新手我想象我正在做的事情可以更好地执行(ThreadSafe?)任何指针
另外作为第二个问题,我如何计算已完成的i的数量,因为我失序了。 感谢
答案 0 :(得分:1)
代码中的错误是对MatchData的并发访问。可能的解决方案:
var matches =
from i in ParallelEnumerable.Range(0, count)
from j in ParallelEnumerable.Range(i+1, count - (i+1))
select GenerateMatch(i, j);
只需使用PLINQ。您不必以这种方式处理同步集合。