据我了解,您不应该使用并行处理来通过其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);
});
所以我的问题是,鉴于以上似乎在测试中有效,让这个通过并行处理是个好主意吗?
感谢您的帮助!
答案 0 :(得分:2)
Revit API不能在有效的Revit API上下文之外使用,并且此类上下文仅由要在Revit事件处理程序中处理的Revit事件通知提供。最常见的事件是外部命令Execute方法。过去,这项要求并未严格执行。但是,在有效的Revit API上下文之外使用Revit API可能会导致崩溃和数据损坏。只读访问可能仍然有效,但风险很大。我当然不会存储Element实例本身。存储ElementId似乎是一个更安全的赌注。请期待随时崩溃。
我的建议是将Revit API交互和处理减少到绝对最小值,收集处理所需的所有数据,在收集数据后终止Revit API交互,然后运行纯计算而不再进行Revit API交互离开Revit API上下文后,在一个单独的线程或稍后的几个线程中。