在c#addin for excel中运行后台线程后未触发工作表事件(单元格更改、选择更改)
我正在为excel开发VSTO加载项。我使用了一个后台工作线程在后台执行一些代码,这样用户就可以在excel工作表上自由地工作了 我在主代码中使用sheet_activate事件处理程序注册了单元格更改和选择更改事件的侦听器,如代码所示:`在c#addin for excel中运行后台线程后未触发工作表事件(单元格更改、选择更改),c#,excel,vsto,backgroundworker,excel-interop,C#,Excel,Vsto,Backgroundworker,Excel Interop,我正在为excel开发VSTO加载项。我使用了一个后台工作线程在后台执行一些代码,这样用户就可以在excel工作表上自由地工作了 我在主代码中使用sheet_activate事件处理程序注册了单元格更改和选择更改事件的侦听器,如代码所示:` private void thisWorkbook_SheetActivate(Object sheet1) { try { if (sheet1 is Worksheet)
private void thisWorkbook_SheetActivate(Object sheet1)
{
try
{
if (sheet1 is Worksheet)
{
Worksheet sheet = sheet1 as Worksheet;
sheet.SelectionChange += eventDel_SelectionChange;
sheet.Change += eventDel_CellsChange;
}
}
catch (Exception e)
{
printException(e);
}
}`
在运行后台工作线程之前,将按预期触发这些事件。但是,在运行后台工作线程之后,不知何故这些事件不会被触发
我必须再次执行此工作簿以解决此问题。每次运行后台工作线程后,我都必须这样做。my background worker中的代码段分析工作表中已经存在的数据,进行一些更改,然后更新工作表中的数据
我确实意识到excel使用COM(组件对象模型)和STA(单线程单元)来执行线程,即一次只有一个线程可以在单元中执行。我不确定这是否是造成问题的原因
有人能解释一下为什么会这样吗?解决这个问题的可能解决方案是什么
我目前正在使用Microsoft Visual Studio 2010和Microsoft Excel 2007
提前谢谢 如果在后台线程上访问excel方法,如范围或更新单元格,则会出现问题。幸运的是,代码没有崩溃和/或抛出异常。我很确定它正在抛出一个异常,而您可能无法捕获它。
至于解决方案,您需要做的是从事件处理程序中需要的工作表中获取所有数据,然后在后台线程中使用该“数据”,而不要从bgnd线程访问excel UI。当线程完成其工作时,您需要了解如何在主UI线程上调用方法(有很多关于如何使用invoke delegate更新主UI线程控件的示例)。如果您正在访问excel方法,如后台线程上的范围或更新单元格,那么您将遇到问题。幸运的是,代码没有崩溃和/或抛出异常。我很确定它正在抛出一个异常,而您可能无法捕获它。
至于解决方案,您需要做的是从事件处理程序中需要的工作表中获取所有数据,然后在后台线程中使用该“数据”,而不要从bgnd线程访问excel UI。当线程完成其工作时,您需要了解如何在主UI线程上调用方法(有很多关于如何使用invoke delegate更新主UI线程控件的示例)。事件的发送者(您案例中的工作簿)必须存储在字段中,而不是本地变量中,才能不被处理。当对象被释放时,事件就消失了。事件的发送者(在您的案例中是工作簿)必须存储在字段中,而不是存储在局部变量中,才能不被释放。当对象被释放时,事件就消失了。Hi Dgorti,Thanx用于输入。实际上,我已经实现了IMessage接口来处理抛出的异常。你能帮我提供一些链接,解释如何从工作后台线程调用主线程吗。现在,我通过GUI中的一个按钮调用上面的sheetactivate函数。有没有一种方法可以从后台线程调用这个函数,并在这样做时调用主线程?同样,我也找不到任何合理的解释来解释为什么会发生这个问题。你能帮我理解这个问题的原因吗?嗨,德格蒂,谢谢你的意见。实际上,我已经实现了IMessage接口来处理抛出的异常。你能帮我提供一些链接,解释如何从工作后台线程调用主线程吗。现在,我通过GUI中的一个按钮调用上面的sheetactivate函数。有没有一种方法可以从后台线程调用这个函数,并在这样做时调用主线程?同样,我也找不到任何合理的解释来解释为什么会发生这个问题。您能帮助我了解此问题的原因吗?您的事件目标是否可能被垃圾回收?当我遇到类似的问题(Excel中的事件在异步调用后不会触发)时,我在这里找到了解决方案:您的事件目标是否可能被垃圾收集?当我遇到类似的问题(Excel中的事件在异步调用后不会触发)时,我在这里找到了解决方案: