Параллельная обработка для извлечения данных с помощью Revit API

Насколько я понимаю, вы не должны использовать параллельную обработку для работы в Revit через его API. Дополнительная информация доступна на http://thebuildingcoder.typepad.com/blog/2014/11/the-revit-api-is-Never-ever-thread-safe.html

Однако в настоящее время я сталкиваюсь с проблемой получения (и только получения), а затем изучения большого количества данных для принятия некоторых решений. Ниже приведен пример кода с использованием TPL, который, похоже, работает:

                Parallel.ForEach<Element>(allDocumentElementsNotVisibleInCurrentView,
                parallelOptions,
                element =>
                {
                    MyDerivedElement iaElement = new MyDerivedElement(uiDocument.Document, element, ElementStatusInView.Found); 

                    // The following condition line does the real heavy lifting and can be a lengthy process, involving data extraction from Revit, such as bounding boxes, geometry and curves
                    if (iaElement.IsContained(iaView))
                        lock (result)
                            result.Add(iaElement);
                });

Итак, мой вопрос: учитывая, что все вышеперечисленное, похоже, работает в тестах, неплохо ли позволить этому пройти параллельную обработку?

Спасибо за помощь!


person The_Outsider    schedule 05.02.2017    source источник
comment
Если тесты проходят успешно, это значит, что вы недостаточно их проверили.   -  person Maxence    schedule 06.02.2017


Ответы (1)


Revit API нельзя использовать вне допустимого контекста Revit API, и такой контекст предоставляется только уведомлением о событии Revit, которое обрабатывается в обработчике событий Revit. Наиболее частым событием является метод выполнения внешней команды. В прошлом это требование строго не соблюдалось. Однако использование Revit API вне допустимого контекста Revit API может привести к сбою и повреждению данных. Доступ только для чтения может работать, но это рискованно. Я бы точно не стал хранить сам экземпляр Element. Хранение ElementId кажется более безопасным. Ожидайте сбоя в любое время.

Я бы порекомендовал сократить взаимодействие и обработку Revit API до абсолютного минимума, собрать все данные, необходимые для обработки, прекратить взаимодействие Revit API после сбора данных, а затем выполнить чистые вычисления без дальнейшего взаимодействия с Revit API в отдельном поток или несколько потоков позже, после выхода из контекста Revit API.

person Jeremy Tammik    schedule 06.02.2017
comment
Большое спасибо за очень полезный ответ. - person The_Outsider; 06.02.2017