При распараллеливании foreach ошибка System.InvalidOperationException - C#

Узнай цену своей работы

Формулировка задачи:

Здраствуйте. Провожу сейчас распараллеливание алоритма поиска ассоциативных правил Есть код.
Листинг программы
  1. public void FindCandidates()
  2. {
  3. int stage = 1;
  4. Candidate c;
  5. List<Candidate> cur, first;
  6. while (_itemset.Count(x => x.Stage == stage) > 0) // Цикл прервется, когда не будет новых кандидатов
  7. {
  8. cur = _itemset.Where(x => x.Stage == stage).ToList(); // Создаем буферы
  9. first = _itemset.Where(x => x.Stage == 1).ToList();
  10. stage++;
  11. foreach (Candidate current in cur)
  12. {
  13. foreach (Candidate f in first)
  14. {
  15. c = new Candidate();
  16. c.items = current.items.Union(f.items).ToList(); // Создаем нового кандидата
  17. if (c.Stage == stage)
  18. {
  19. bool hasMatch = _itemset.Any(x => x.items.Intersect(c.items).Count() == c.items.Count);//тут exception
  20. if ((c.Support = FindSupport(c)) > _minSupport && c.Support < _maxSupport && !hasMatch)
  21. _itemset.Add(c);
  22. }
  23. }
  24. }
  25. }
  26. }
Когда я пытаюсь заменить цикл foreach версией Parallel.ForEach, то ловлю System.InvalidOperationException в стороке
Листинг программы
  1. bool hasMatch = _itemset.Any(x => x.items.Intersect(c.items).Count() == c.items.Count);//тут exception
Код выглядит так, к примеру
Листинг программы
  1. public void FindCandidates()
  2. {
  3. int stage = 1;
  4. Candidate c;
  5. List<Candidate> cur, first;
  6. while (_itemset.Count(x => x.Stage == stage) > 0) // Цикл прервется, когда не будет новых кандидатов
  7. {
  8. cur = _itemset.Where(x => x.Stage == stage).ToList(); // Создаем буферы
  9. first = _itemset.Where(x => x.Stage == 1).ToList();
  10. stage++;
  11. Parallel.ForEach(cur, (Candidate current) =>
  12. {
  13. foreach (Candidate f in first)
  14. {
  15. c = new Candidate();
  16. c.items = current.items.Union(f.items).ToList(); // Создаем нового кандидата
  17. if (c.Stage == stage)
  18. {
  19. bool hasMatch = _itemset.Any(x => x.items.Intersect(c.items).Count() == c.items.Count);//тут exception
  20. if ((c.Support = FindSupport(c)) > _minSupport && c.Support < _maxSupport && !hasMatch)
  21. _itemset.Add(c);
  22. }
  23. }
  24. });
  25. }
  26. }
В чем может быть проблема?

Решение задачи: «При распараллеливании foreach ошибка System.InvalidOperationException»

textual
Листинг программы
  1. _itemset.Add(c);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы