【问题标题】:C# VSTO: How to block a user from interacting with client (Excel) for a brief period?C# VSTO:如何在短时间内阻止用户与客户端 (Excel) 交互?
【发布时间】:2018-09-03 22:40:25
【问题描述】:

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

来自 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 自然会暂时锁定。我想在我的程序中认为有必要时触发该行为,如本场景所示。

【问题讨论】:

  • 老实说,我不熟悉使用 VS+C#,但这听起来像 XY Problem... 一个尝试解决另一个问题的变通方法的问题。必须有更好的方法来防止这个错误发生在简单的用户交互中......
  • 看看这个:social.msdn.microsoft.com/Forums/vstudio/en-US/…,关于这个问题有一些扎实的讨论。
  • 已确定 Excel 中的多线程处理很复杂,只有一些变通方法可行。就我而言,此解决方法是锁定 Excel 与用户交互。我问的是如何做到这一点。所以我认为我的问题很简单,当然也不是 XY 问题。
  • 感谢您的文章。虽然我不确定阅读后是否会感到更加困惑,但我认为有些想法可以应用到我的项目中。但是,我暂时阻止用户的想法似乎是一个合理的选择,这里没有讨论,当然也不能回答这篇文章的主要问题。
  • 当您不使用单独的线程时,Excel 通常会阻塞,因此答案取决于您首先这样做的原因。可能显示进度条?可能还有其他方法可以做任何事情。

标签: c# excel multithreading vsto


【解决方案1】:

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

  1. 你也许可以用this 逃脱,但我真的不知道它有多可靠。问这个问题的人说这对他不起作用。我不知道为什么会这样;可能是他实施错误,或者可能存在未说明的限制。

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

  3. 完全阻止 UI,并可能添加一个进度条。对于需要几秒钟/几分钟的事情,我经常这样做,只要您一次只从一个线程访问 API,它就可以正常工作。 This 是我使用的进度条(稍作修改)。

【讨论】:

  • 我是在 1 中提出问题的人。尽管实施了,但没有触发消息过滤器。还有人指出他们也有麻烦,而且它并不能解决所有问题。 2是一个不错且实用的想法,非常感谢!阻止 UI 和与 Excel 的交互,并在我的插件写入 Excel 时添加进度条接近我想要的 - 但是我不确定如何阻止 UI 和与 Excel 的交互。我需要更详细地阅读您推荐的链接。谢谢。
  • 您只是打开一个模态对话框,但它必须在整个操作中都存在,而不仅仅是最后一部分。
  • 尽管我喜欢您链接中的解决方案,但我正在努力实施它。似乎用 VSTO 项目实现 WPF 并不简单。您对此有什么建议吗?
  • 你说的是#2吗?你可能需要How to Use WPF Controls Inside an Excel Actions Pane?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 2015-09-10
  • 2021-02-22
  • 1970-01-01
相关资源
最近更新 更多