在for循环

时间:2018-01-13 18:52:21

标签: c# asynchronous autodesk revit-api

我在这里使用方法http://teocomi.com/export-revit-warnings-list-from-api/并从应用程序宏方法调用它来导出rvt文件文件夹的警告:

public async void ExportWarningHTML()
{
    Autodesk.Revit.UI.UIApplication uiapp = this;
    Document doc = uiapp.ActiveUIDocument.Document;

    // Input Directory
    string inputDir = @"C:\input";

    // Output Directory
    string outputDir = @"C:\output";

    //Get files from inputDir
    string[] files = Directory.GetFiles(inputDir, "*.rvt");

    // Set open options to detach from central and preserve ws
    OpenOptions openOptions = new OpenOptions();
    openOptions.DetachFromCentralOption = DetachFromCentralOption.DetachAndPreserveWorksets;

    // Process each *.rvt file in folder
    // Naive approach. DOES NOT WORK.           
    foreach(string file in files)
    {           
        // Get current doc
        var docLast = uiapp.ActiveUIDocument.Document;

        // Open new document
        var docNext = ActiveUIDocument.Application.OpenAndActivateDocument(file);

        // Close last document          
        docLast.Close(false);

        // Export Warnings
        var html = await Win32Api.ExportWarinings(uiapp, outputDir);    
    }   
}

}

但是这只适用于第一个文件然后崩溃。如何修改此代码或链接到的链接“ExportWarnings”代码,使此进程成为.rvt文件的文件夹。

1 个答案:

答案 0 :(得分:0)

祝贺你对Export Revit Warnings List From Api非常好的解决方案!

如您所知,Revit API只能在有效的Revit API上下文中使用。这种上下文仅在Revit API提供的回调函数中提供,例如外部命令Execute。此外,Revit API不是多线程的。在这样的上下文之外调用API可能会导致崩溃。这可能正是您所经历的。

因此,我想知道在这种情况下是否可以使用async。处理这些限制的一种可能性是利用外部事件:

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

此代码是否以外部命令Execute方法运行?如果是这样,那么只需删除async内容,然后重复调用Sleep直到Revit处理完第一个文件?

不,这可能行不通,可能根本就不对。

下一个建议:删除async;进行调用以处理下一个文件;完成后,举起一个外部事件;在外部事件中,重复算法处理下一个文件;等

我非常期待听到你如何解决这个问题!