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

时间:2015-10-25 15:04:06

标签: c# multithreading revit-api

对于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本身在同一个线程中。为了提供无模式窗口,我将mw.ShowDialg();更改为mw.Show();。尽管插件成功启动并且MainWindow变为无模式且用户能够同时与插件和Revit交互,但当我在MainWindow中打开事务时,revit崩溃,因为Execute()方法在打开该事务之前终止。

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

2 个答案:

答案 0 :(得分:3)

请参阅Building Coder blog以获取有关该主题的长长讨论列表。如果您希望能够拥有无模式对话框,则可以使用ExternalEvents或空闲事件。但是,如果您希望同时运行多个线程,那么您就不幸了,因为Revit API不允许它。

答案 1 :(得分:2)

马特是绝对正确的。 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