我正在Excel和C#VSTO中使用多线程。当我使用辅助线程写入Excel工作表,并且以Excel用户身份在编写过程中与Excel进行交互时,我得到
HRESULT异常:0x800AC472。
如果我不执行此交互,则编写成功完成。
由于这个原因,我相信,如果在编写操作进行过程中可以完全阻止或锁定用户与Excel进行交互,则不会再收到此错误消息。我已经尝试设置sheet.EnableSelection = Microsoft.Office.Interop.Excel.XlEnableSelection.xlNoSelection
来禁用用户的选择能力,然后在写完之后再启用它,但是这并不能阻止所有交互,并且仍然会弹出上述错误。是的,Office应用程序中的多线程非常复杂,有人甚至不建议这样做,但是here我们看到我的技术是在MSDN论坛上建议的一种技术:{{1 }}
在不使用多线程的情况下在VSTO上执行操作时,Excel自然会暂时锁定。如本场景所示,我希望在程序中有必要时触发该行为。
答案 0 :(得分:2)
您的用例似乎很合理,所以我认为这是您可以解决的方法。
您也许可以摆脱this,但我真的不知道它有多牢固。这个问题的提问者说这对他不起作用。我不知道为什么会这样。也许他执行错了,或者它有未说明的局限性。
不是立即进行更改,而是向任务/操作窗格添加按钮,在完成计算并单击后启用它,然后修改电子表格。 This is a documented approach。
完全阻止UI,并可能添加进度条。我经常要花几秒钟/几分钟来执行此操作,只要您一次只从一个线程访问API,它就可以正常工作。 This是我使用的进度条(进行了一些小的修改)。