При распараллеливании 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д