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

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

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

Здраствуйте. Провожу сейчас распараллеливание алоритма поиска ассоциативных правил Есть код.
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);
                        }
                    }
                }
            }
        }
Когда я пытаюсь заменить цикл foreach версией Parallel.ForEach, то ловлю System.InvalidOperationException в стороке
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);

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


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

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

5   голосов , оценка 4.2 из 5
Похожие ответы