在 for 循环中导出警告异步任务

Export Warning async task in for loop

我这里有方法 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 文件的文件夹。

祝贺您对 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;调用处理下一个文件;完成后,引发外部事件;在外部事件中,重复算法以处理下一个文件;等等

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