2012-05-18 3 views
1

Я пытаюсь выполнить итерации по большому набору объектов, чтобы увидеть, насколько близко они соответствуютпрерывистый мощность была меньше, чем текущий размер ошибки

я изначально писал (где 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); 
     }}); 

дисконтирование, что это даст мне огромный список, он иногда (но не всегда) выдает ошибку «мощность была меньше, чем текущий размер»

будучи достаточно новой для параллельной библиотеке я представить себе, что я (может быть выполнено лучше) (ThreadSafe?) любые указатели

также как второстепенный вопрос, как получить счет на число i, которое было завершено, так как i выведен из строя. Thanks

ответ

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. Таким образом, вам не нужно иметь дело с синхронизированными коллекциями.

Смежные вопросы