在 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
;调用处理下一个文件;完成后,引发外部事件;在外部事件中,重复算法以处理下一个文件;等等
非常期待听到您如何解决这个问题!
我这里有方法 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
;调用处理下一个文件;完成后,引发外部事件;在外部事件中,重复算法以处理下一个文件;等等
非常期待听到您如何解决这个问题!