簡體   English   中英

使用Revit API並行處理以提取數據

[英]Parallel Processing to Extract Data Using Revit API

據我了解,您不應使用並行處理通過Revit的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可能會導致崩潰和數據損壞。 只讀訪問可能仍然有效,但存在風險。 我當然不會存儲Element實例本身。 存儲ElementId似乎是一個更安全的選擇。 請期待隨時崩潰。

我的建議是將Revit API的交互和處理減少到最低限度,收集處理所需的所有數據,在收集數據后終止Revit API的交互,然后在沒有其他Revit API交互的情況下運行純計算離開Revit API上下文之后的一個或多個線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM