C#VSTO:如何在短时间内阻止用户与客户端(Excel)交互?

时间:2018-09-03 22:40:26

标签: c# excel multithreading vsto

我正在Excel和C#VSTO中使用多线程。当我使用辅助线程写入Excel工作表,并且以Excel用户身份在编写过程中与Excel进行交互时,我得到

  

HRESULT异常:0x800AC472。

如果我不执行此交互,则编写成功完成。

由于这个原因,我相信,如果在编写操作进行过程中可以完全阻止或锁定用户与Excel进行交互,则不会再收到此错误消息。我已经尝试设置sheet.EnableSelection = Microsoft.Office.Interop.Excel.XlEnableSelection.xlNoSelection来禁用用户的选择能力,然后在写完之后再启用它,但是这并不能阻止所有交互,并且仍然会弹出上述错误。是的,Office应用程序中的多线程非常复杂,有人甚至不建议这样做,但是here我们看到我的技术是在MSDN论坛上建议的一种技术:{{1 }}

在不使用多线程的情况下在VSTO上执行操作时,Excel自然会暂时锁定。如本场景所示,我希望在程序中有必要时触发该行为。

1 个答案:

答案 0 :(得分:2)

您的用例似乎很合理,所以我认为这是您可以解决的方法。

  1. 您也许可以摆脱this,但我真的不知道它有多牢固。这个问题的提问者说这对他不起作用。我不知道为什么会这样。也许他执行错了,或者它有未说明的局限性。

  2. 不是立即进行更改,而是向任务/操作窗格添加按钮,在完成计算并单击后启用它,然后修改电子表格。 This is a documented approach

  3. 完全阻止UI,并可能添加进度条。我经常要花几秒钟/几分钟来执行此操作,只要您一次只从一个线程访问API,它就可以正常工作。 This是我使用的进度条(进行了一些小的修改)。