- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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自然会暂时锁定。当我觉得在我的程序中有必要时,我想触发该行为,如本场景所示。
最佳答案
您的用例似乎很合理,所以我认为您可以通过以下方式解决它。
你也许可以逃脱 this但我真的不知道它有多坚固。那个问题的提问者说这对他不起作用。我不知道为什么会这样;也许他实现错误,或者它有未说明的局限性。
不是立即进行更改,而是向任务/操作 Pane 添加一个按钮,在计算完成后启用它,并在单击它时修改电子表格。 This is a documented approach .
完全屏蔽 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/
我是一名优秀的程序员,十分优秀!