Parallel.Invoke

Автор Тема: Parallel.Invoke  (Прочитано 11080 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
Re: Parallel.Invoke
« Ответ #15 : 11-11-2020, 12:02:08 »
Просто любопытное наблюдение по теме Parallel.ForEach:
Если сохранить ObjectId объектов чертежа, а затем в параллельном цикле проверять id.IsNull и id.IsErased - все прекрасно работает.
НО! Как только добавляем проверку id.IsValid - цикл начинает колбасить. Причем ооочень странно колбасить. Ни ошибок, ни фаталов. Просто цикл выполняется не над всеми объектами списка. Иногда не выполняются инструкции находящиеся даже ДО проверки IsValid. Я вставил в тело процедуры несколько счетчиков и несколько раз видел парадоксальный результат - счетчик в самом начале процедуры "натикал" меньше, чем в конце, после всех условий. Этого вообще никак не может быть, но факт...
Вывод - структуры из API тоже могут лезть в чертеж в самые неожиданные моменты и вызывать самые неожиданные глюки.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Parallel.Invoke
« Ответ #16 : 11-11-2020, 12:21:44 »
Как только добавляем проверку id.IsValid - цикл начинает колбасить.
Так и должно быть. Ведь для того, чтобы проверить корректность ObjectId, AutoCAD должен полезть в базу данных. id.IsNull очевидно проверяет на 0 равенство одно из полей, id.IsErased тоже вполне возможно считывает некое поле в самом ObjectId, не обращаясь к базе.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение