2016-12-29 7 views
0

Excel用のVSTOアドインを開発中です。私はバックグラウンドでいくつかのコードを実行するためにバックグラウンドワーカースレッドを使用しました。そのため、ユーザーはExcelシートで自由に作業できます。コードに示すように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); 
     } 
    }` 

をバックグラウンドワーカースレッドを実行する前に、これらのイベントは、としてトリガなっています期待される。ただし、バックグラウンドワーカースレッドを実行した後、これらのイベントは何らかの形でトリガーされません。

この問題を解決するには、thisWorkbook_SheetActivateをもう一度実行する必要があります。バックグラウンドワーカースレッドを実行した後は毎回これを行う必要があります。バックグラウンドワーカーのコードは、すでにワークシートにあるデータを分析し、変更を加えてシート内のデータを更新します。

ExcelはCOM(Component Object Model)とSTA(Single Threaded Apartment)を使用してスレッドを実行することを認識しています。つまり、一度に1つのスレッドしかアパートメント内で実行できません。これが問題を引き起こしているかどうかはわかりません。

誰かがなぜこれが起こっているのか説明できますか?問題を解決するための解決策は何ですか?私は現在、マイクロソフトのVisual Studio 2010およびMicrosoft Excelの事前の2007

おかげで働いている

答えて

0

バックグラウンドスレッドの範囲やセルの更新などのExcelメソッドにアクセスしている場合、問題が発生します。コードがクラッシュしたり、例外をスローしたりしなかったのは、これまで幸いです。私はそれが例外を投げていることをかなり確信しており、あなたはそれをキャッチしていないかもしれません。 解決策としては、イベントハンドラで必要なシートからすべてのデータを取得し、バックグラウンドスレッドでその "データ"を使用し、bgndスレッドからExcel UIにアクセスしないでください。スレッドが終了したら、メインのUIスレッドでメソッドを呼び出す方法が必要です(Invokeデリゲートを使用してメインのUIスレッドコントロールを更新する方法の例がたくさんあります)。

+0

こんにちはDgorti、入力のThanx。実際には、例外をスローするためにIMessage Interfaceを実装しました。あなたは、動作中のバックグラウンドスレッドからメインスレッドを呼び出す方法を説明するリンクを教えてください。今のところ、私はGUIのボタンを介して上記のシートアクティビティ関数を呼び出しています。バックグラウンドスレッドからこの関数を呼び出し、メインスレッドを呼び出す方法はありますか? –

+0

また、なぜこの問題が起こっているのかについては、どこからでもわかりやすい説明を見つけることができません。この問題の理由を理解するのを助けてくれますか? –

関連する問題