如何为 Revit 编写多线程插件?

How to write a Multi threaded plugin for Revit?

对于 Revit 插件,我编写了以下代码:

public Result Execute(ExternalCommandData commandData,
                       ref string message, ElementSet elements)
    {
        try
        {
            Global.GetInstance(commandData);
            message = "Studio Launcher";
            var mw = new MainWindow();
            mw.ShowDialg();
        }
        catch (Exception)
        {
            TaskDialog.Show("Failure", "Please Open or Create a document");
            return Result.Failed;
        }
        return Result.Succeeded;
    }

在这个插件中 MainWindow 是一个 ui 用户与之交互并且一些交易发生在那里。
它很有魅力,但表单不是无模式的,因为该插件与 Revit 本身位于同一线程中。为了提供无模式的 window,我将 mw.ShowDialg(); 更改为 mw.Show();。虽然插件成功启动并且 MainWindow 变为无模式并且用户能够同时与插件和 Revit 交互,但当我在 MainWindow 中打开事务时,revit 崩溃,因为 Execute() 方法在打开该事务之前终止。

如果有任何方法可以为 revit 开发多线程插件,请帮助我。

有关该主题的一长串讨论,请参阅 Building Coder blog。如果您只是希望能够有一个无模式对话框,那么可以使用 ExternalEvents 或 Idling Events。但是,如果您希望同时 运行 多个线程,那么您就不走运了,因为 Revit API 不允许这样做。

马特完全正确。 Revit API 根本不支持多线程。 Revit API 的使用需要有效的 API 上下文,并且仅在 Revit 事件处理程序中提供,例如Application.OnStartup、外部事件执行、DMO 执行等

解决方法是使用外部事件。 ModelessDialog/ModelessForm_ExternalEvent 示例提供了一个示例,The Building Coder 主题组提供了关于此的一长串详细讨论,关于无模式访问和从外部驱动 Revit 的空闲和外部事件:

http://thebuildingcoder.typepad.com/blog/about-the-author.html#5.28