2016-12-29 56 views
0

我正在爲excel開發一個VSTO加載項。我使用後臺工作線程在後臺執行一段代碼,以便用戶可以自由地在Excel表格上工作。在excel中運行c#addin後臺線程後沒有觸發Sheet事件(單元格更改,選擇更改)

我註冊了小區變更和使用主代碼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); 
     } 
    }` 

運行後臺工作線程之前,這些事件越來越引起作爲預期。但是,運行後臺工作線程後,不知何故這些事件不會被觸發。

我必須執行thisWorkbook_SheetActivate再次解決此問題。每次運行後臺工作線程後,我都必須這樣做。我的後臺工作人員中的代碼段分析工作表中已存在的數據,進行一些更改,然後更新工作表中的數據。

我知道excel使用COM(組件對象模型)和STA(單線程公寓)來執行線程,即一次只能在公寓內執行一個線程。我不確定這是否會導致問題。

有人可以解釋爲什麼會發生這種情況?解決此問題的可能解決方案是什麼?

我目前正在使用Microsoft Visual Studio 2010和Microsoft Excel 2007.

在此先感謝!

回答

0

如果您正在訪問excel方法(如後臺線程上的範圍或更新單元格),那麼您將遇到問題。到目前爲止,你很幸運,代碼沒有崩潰和/或拋出異常。我很確定它拋出了一個異常,你可能沒有捕捉到它。 至於解決方案,您需要做的是從事件處理程序中的工作表中獲取所有數據,然後在後臺線程中使用該「數據」,並且不從bgnd線程訪問excel UI。當線程完成其工作時,您需要如何在主UI線程上調用方法(有大量有關如何使用Invoke委託更新主UI線程控件的示例)。

+0

嗨Dgorti,Thanx爲輸入。其實我已經實現了IMessage接口來處理拋出的異常。你能幫我解釋如何從工作後臺線程調用主線程的任何鏈接。現在,我通過GUI中的按鈕調用上面的sheetactivate函數。有沒有辦法從後臺線程調用這個函數,並調用主線程? –

+0

另外,我無法在任何地方找到任何合理的解釋,爲什麼會發生這個問題。你能幫我理解這個問題的原因嗎? –

相關問題