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