Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#addin for excel中运行后台线程后未触发工作表事件(单元格更改、选择更改)_C#_Excel_Vsto_Backgroundworker_Excel Interop - Fatal编程技术网

在c#addin for excel中运行后台线程后未触发工作表事件(单元格更改、选择更改)

在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)

我正在为excel开发VSTO加载项。我使用了一个后台工作线程在后台执行一些代码,这样用户就可以在excel工作表上自由地工作了

我在主代码中使用sheet_activate事件处理程序注册了单元格更改和选择更改事件的侦听器,如代码所示:`

    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中的事件在异步调用后不会触发)时,我在这里找到了解决方案: