При распараллеливании foreach ошибка System.InvalidOperationException - C#
Формулировка задачи:
Здраствуйте. Провожу сейчас распараллеливание алоритма поиска ассоциативных правил
Есть код.
Когда я пытаюсь заменить цикл foreach версией Parallel.ForEach, то ловлю System.InvalidOperationException в стороке
Код выглядит так, к примеру
В чем может быть проблема?
public void FindCandidates()
{
int stage = 1;
Candidate c;
List<Candidate> cur, first;
while (_itemset.Count(x => x.Stage == stage) > 0) // Цикл прервется, когда не будет новых кандидатов
{
cur = _itemset.Where(x => x.Stage == stage).ToList(); // Создаем буферы
first = _itemset.Where(x => x.Stage == 1).ToList();
stage++;
foreach (Candidate current in cur)
{
foreach (Candidate f in first)
{
c = new Candidate();
c.items = current.items.Union(f.items).ToList(); // Создаем нового кандидата
if (c.Stage == stage)
{
bool hasMatch = _itemset.Any(x => x.items.Intersect(c.items).Count() == c.items.Count);//тут exception
if ((c.Support = FindSupport(c)) > _minSupport && c.Support < _maxSupport && !hasMatch)
_itemset.Add(c);
}
}
}
}
}bool hasMatch = _itemset.Any(x => x.items.Intersect(c.items).Count() == c.items.Count);//тут exception
public void FindCandidates()
{
int stage = 1;
Candidate c;
List<Candidate> cur, first;
while (_itemset.Count(x => x.Stage == stage) > 0) // Цикл прервется, когда не будет новых кандидатов
{
cur = _itemset.Where(x => x.Stage == stage).ToList(); // Создаем буферы
first = _itemset.Where(x => x.Stage == 1).ToList();
stage++;
Parallel.ForEach(cur, (Candidate current) =>
{
foreach (Candidate f in first)
{
c = new Candidate();
c.items = current.items.Union(f.items).ToList(); // Создаем нового кандидата
if (c.Stage == stage)
{
bool hasMatch = _itemset.Any(x => x.items.Intersect(c.items).Count() == c.items.Count);//тут exception
if ((c.Support = FindSupport(c)) > _minSupport && c.Support < _maxSupport && !hasMatch)
_itemset.Add(c);
}
}
});
}
}Решение задачи: «При распараллеливании foreach ошибка System.InvalidOperationException»
textual
Листинг программы
_itemset.Add(c);