2017-02-05 2 views
0

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

Однако в настоящее время я имею дело с проблемой получения (и получения только), а затем изучения большого количества данных для принятия некоторых решений. Образец код с помощью 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); 
       }); 

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

Благодарим за помощь!

+0

«Если тесты проходят, это потому, что вы недостаточно проверили». – Maxence

ответ

2

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

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

+0

Большое спасибо за ваш очень полезный ответ. –

Смежные вопросы