【问题标题】:Export Warning async task in for loop在 for 循环中导出警告异步任务
【发布时间】:2018-06-22 22:00:04
【问题描述】:

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

【问题讨论】:

  • 由于您打开和关闭文档的方式,它看起来像是崩溃了。我可能错了,这只是一种预感。尝试添加尝试捕获和断点以查看崩溃的位置。只是猜测它可能最好阅读ActiveUIDocument.Application.OpenAndActivateDocument(file); await Win32Api.ExportWarinings(uiapp, outputDir); ActiveUIDocument.Application.Close(false); 可能是错误的,但我看不出,从这段代码中,有任何理由这样做。

标签: c# asynchronous autodesk revit-api


【解决方案1】:

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

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

【讨论】:

  • 谢谢杰里米!很荣幸得到您的回复。我也在考虑同样的思路,现在我有了一个使用有效的外部事件的解决方案。稍后我将发布更详细的后续评论。您指向活动文档的链接帮助我直截了当。作为记录,我在问题中链接到的代码不是我的。谢谢。
  • 我的荣幸!谢谢你的赞赏!恭喜解决!期待更详细的样品。如果它完整且通用,足以引起普遍兴趣,我很乐意将其添加到博客中。
猜你喜欢
  • 2019-01-28
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 2017-09-30
  • 2017-12-23
  • 2014-04-19
相关资源
最近更新 更多