使用Revit API提取数据的并行处理

时间:2017-02-05 07:00:51

标签: revit-api

据我了解,您不应该使用并行处理来通过其API在Revit中执行操作。有关更多信息,请访问: 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);
                });

所以我的问题是,鉴于以上似乎在测试中有效,让这个通过并行处理是个好主意吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

Revit API不能在有效的Revit API上下文之外使用,并且此类上下文仅由要在Revit事件处理程序中处理的Revit事件通知提供。最常见的事件是外部命令Execute方法。过去,这项要求并未严格执行。但是,在有效的Revit API上下文之外使用Revit API可能会导致崩溃和数据损坏。只读访问可能仍然有效,但风险很大。我当然不会存储Element实例本身。存储ElementId似乎是一个更安全的赌注。请期待随时崩溃。

我的建议是将Revit API交互和处理减少到绝对最小值,收集处理所需的所有数据,在收集数据后终止Revit API交互,然后运行纯计算而不再进行Revit API交互离开Revit API上下文后,在一个单独的线程或稍后的几个线程中。