C# VSTO : How to block a user from interacting with client (Excel) for a brief period?

标签 c# excel multithreading vsto

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

Exception from HRESULT: 0x800AC472.

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

因此,我相信,如果我可以在写入操作进行时完全阻止或锁定用户与 Excel 的交互,我将不会再收到此错误消息。我已经尝试设置 sheet.EnableSelection = Microsoft.Office.Interop.Excel.XlEnableSelection.xlNoSelection禁用用户进行选择的能力,然后在写入完成后启用它,但这不会阻止所有交互,并且仍然会弹出上述错误。是的,Office 应用程序中的多线程很复杂,有些人甚至会说不推荐,但是here我们看到我的技术是 MSDN 论坛上推荐的一种技术:Its not advisable to try to interact with the Excel object model in a multi-threaded way (except by using locks to force single-threaded access).

在没有多线程的情况下对 VSTO 执行操作时,Excel 自然会暂时锁定。当我觉得我的程序中有必要时,我想触发该行为,如本场景所示。

最佳答案

您的用例似乎很合理,所以我认为您可以通过以下方式绕过它。

  1. 您也许可以逃脱 this 的惩罚。但我真的不知道它有多坚固。提出这个问题的人说这对他不起作用。我不知道为什么会这样;也许他实现错误,或者它可能有未说明的局限性。

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

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

关于C# VSTO : How to block a user from interacting with client (Excel) for a brief period?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52156824/

相关文章:

c# - Excel 自动化 : Open existing Excel file as "new"

excel - 打开对话框默认为指定的网络路径(不是驱动器)

java - 关于java中使用阻塞队列方法的生产者和消费者模式

java - 使用模数和指数在 C# 中进行 RSA/ECB/PKCS1Padding 解密

c# - 使用 LINQ 迭代类属性

c# - 如何解密 key

c# - Excel 互操作库无法在 Azure 上运行

c# - OnClientClick 代码阻止验证工作

java - 横向滚动背景移出框架

c - 用C语言实时高效处理数据并插入数据库