在 Visio Addin 中,API 方法 Application.Documents.OpenEx() 在打开多个文件后抛出异常(一个接一个,而不是并行)

In Visio Addin, the API method Application.Documents.OpenEx() throw exception after opening several files (one after the other and not in parallel)

我正在尝试通过加载项以编程方式打开一些文件(50-400 之间),以便对其进行编辑。 我按顺序执行此操作,打开一个,编辑,关闭等等。

有时,在意外行为中,OpenEx () 方法抛出一个 system.accessviolationexception 并且程序停止,我无法清除程序试图打开的文件并且无法取消打开和打开的请求继续前进。

我可以捕获异常,但一旦它发生在特定文件上,然后尝试打开以下所有文件也会引发异常。 我想问一下: 1.为什么这有时会不一致地发生? 2. 有没有办法取消文件打开请求?内存是否需要/可以清除?我需要做什么才能在某些文件发生这种情况后打开文件?

这是主要代码:

Globals.ThisAddIn.Application.Documents.OpenEx(currVisioFile,(int)Microsoft.Office.Interop.Visio.VisOpenSaveArgs.visOpenRW);

如果从 Visio 加载项本身打开大量文件不稳定或变得不稳定(我也一直面临这个问题),我建议为您拥有的每个文档打开和关闭一个新的 Visio 实例。

例如,在 Python 中,一种方法是安装 pypiwin32 软件包,然后 运行 安装以下脚本:

import win32com.client

documentsToProcess = ["path/to/doc1", "path/to/doc2", "path/to/doc3"]

for path in documentsToProcess:
    app = win32com.client.DispatchEx("Visio.Application") # Open new Visio instance
    doc = app.Documents.Open(path) # Open your document (and hopefully blocks)
    doc.Saved = true # For quiet exit
    app.Quit()

您可以找到关于 Open 函数和所有其他对象和方法的所有官方文档 here

然后您将更改加载项代码,使其在处理文档之前等待文档打开,如下所示:

private void ThisAddIn_Startup(object sender, System.EventArgs e) {
    // We subscribe to the DocumentOpened/Created event
    this.Application.DocumentOpened += Application_DocumentOpened;
}

private void Application_DocumentOpened(Document doc) {
    // Process your document here.
    // Do your work on your document here!
}

通常,您必须在每个文档上完成的工作比仅仅创建一个新的 Visio 实例要长得多,因此这应该不是问题。

也许您需要进行一些更改以确保 Visio 实例正确关闭,但就是这样。如果需要,您也可以在进程卡住时强制终止该进程。