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

Parallel Processing to Extract Data Using 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);
                });

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

感谢您的帮助!

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

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