【问题标题】:Parallel Processing to Extract Data Using Revit API使用 Revit API 进行并行处理以提取数据
【发布时间】:2017-02-06 16:29:36
【问题描述】:

据我了解,您不应该使用并行处理通过其 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


【解决方案1】:

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

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

【讨论】:

  • 非常感谢您非常有用的回复。
猜你喜欢
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
相关资源
最近更新 更多