C# VSTO:如何阻止用户在短时间内与客户端 (Excel) 交互?
C# VSTO: How to block a user from interacting with client (Excel) for a brief period?
我正在 Excel 和 C# VSTO 中使用多线程。当我使用辅助线程写入 Excel sheet 并且我作为 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 但我真的不知道它有多可靠。那个问题的提问者说这对他不起作用。我不知道为什么会这样;也许他实施错了,或者它有未说明的限制。
不是立即进行更改,而是向 task/actions 窗格添加一个按钮,在计算完成后启用它,并在单击它时修改电子表格。 This is a documented approach.
完全阻止 UI,并可能添加一个进度条。对于需要几个 seconds/minutes 的事情,我经常这样做,只要您一次只从一个线程访问 API,它就可以正常工作。 This是我使用的进度条(有一些小的修改)。
我正在 Excel 和 C# VSTO 中使用多线程。当我使用辅助线程写入 Excel sheet 并且我作为 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 但我真的不知道它有多可靠。那个问题的提问者说这对他不起作用。我不知道为什么会这样;也许他实施错了,或者它有未说明的限制。
不是立即进行更改,而是向 task/actions 窗格添加一个按钮,在计算完成后启用它,并在单击它时修改电子表格。 This is a documented approach.
完全阻止 UI,并可能添加一个进度条。对于需要几个 seconds/minutes 的事情,我经常这样做,只要您一次只从一个线程访问 API,它就可以正常工作。 This是我使用的进度条(有一些小的修改)。