Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для zewer
2357 / 1775 / 212
Регистрация: 07.01.2011
Сообщений: 10,342

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

17.11.2015, 21:37. Показов 1885. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте. Провожу сейчас распараллеливание алоритма поиска ассоциативных правил
Есть код.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 в стороке
C#
1
bool hasMatch = _itemset.Any(x => x.items.Intersect(c.items).Count() == c.items.Count);//тут exception
Код выглядит так, к примеру

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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);
                        }
                    }
                });
            }
        }
В чем может быть проблема?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.11.2015, 21:37
Ответы с готовыми решениями:

Ошибка InvalidOperationException при Xml сериализации
Здравствуйте! У меня возникла проблема при xml сериализации. Суть проблемы такова, я хочу сохранить список List&lt;myReference&gt; в...

Исключение System.InvalidOperationException
выбрасывает когда пытаюсь по таймеру добавлять текст в текст бокс public partial class MainWindow : Window { Timer...

Необработанное исключение типа "System.InvalidOperationException" в System.Data.dll
В программировании нуб. Помогите исправить ошибку. Делал всё по видео-уроку. Но почему то при заполнении id и name, выдаёт: ...

3
 Аватар для Sigin
226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808
18.11.2015, 02:27
List - не Thread-safe класс, используйте ConcurentBag<T>
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.11.2015, 09:49
Лучший ответ Сообщение было отмечено zewer как решение

Решение

Цитата Сообщение от zewer Посмотреть сообщение
В чем может быть проблема?
В том, что вы изменяете коллекцию вот здесь:
C#
1
_itemset.Add(c);
В то же самое время, когда другой поток обходит ее через foreach вот здесь:
C#
1
_itemset.Any(x => x.items.Intersect(c.items).Count() == c.items.Count);
В данном случае никакие ConcurrentBag не помогут — вам надо либо отказываться от линка, либо синхронизировать эти две строчки.
1
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
18.11.2015, 10:06
Скорее всего для ошибки достаточно одного оператора _itemset.Add(c);
Если несколько потоков одновременно начнут добавлять данные, дело может закончиться исключением
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.11.2015, 10:06
Помогаю со студенческими работами здесь

Ислючение System.InvalidOperationException
Добрый день, всему доброму населению этого сайта!!! Прошу небольшой помощи у Вас в объяснении возможной ошибки. Есть табличка...

Исключение System.InvalidOperationException «для BeginExecuteReader нужно открытое и доступное подключение»
Всем привет. Я наткнулся на непредвиденную проблему. Что надо исправить в коде, чтобы убрать исключение...

System.InvalidOperationException: Существует назначенный этой команде Command открытый DataReader
Доброго времени. C# начал изучать недавно. До работ с БД и изучению технологии ADO.net я не дошел, но обстоятельства сложились так, что мне...

System.InvalidOperationException
System.InvalidOperationException: &quot;NarutoProjectUWP.Save is inaccessible due to its protection level. Only public types can be processed.&quot; ...

Выбрасывает System.InvalidOperationException
Привет всем. Возникает ошибка при редактировании DataGrid: System.InvalidOperationException: &quot;Операция недопустима, когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru