2016-12-29 7 views
0

Я разрабатываю надстройку VSTO для Excel. Я использовал поток рабочего фона, чтобы выполнить часть кода в фоновом режиме, чтобы пользователь мог работать над листом excel.Листовые события (смена ячеек, смена смены) не срабатывание после запуска фонового потока в C# addin for 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) для выполнения потоков, т. Е. В квартире может выполняться только один поток. Я не уверен, что это может вызвать проблемы.

Может кто-нибудь объяснить, почему это происходит? Каковы возможные решения проблемы?

Я в настоящее время работает на Microsoft Visual Studio 2010 и Microsoft Excel 2007.

Спасибо заранее!

ответ

0

Если вы используете методы excel, такие как диапазоны или обновляющие ячейки в фоновом потоке, тогда у вас будет проблема. Пока что вам повезло, что код не сбой и/или исключение. Я уверен, что это исключение, и вы не можете его поймать. Что касается решения, то вам нужно получить все данные с листа, который вы хотите в обработчиках событий, а затем использовать эти «данные» в фоновом потоке и не получить доступ к пользовательскому интерфейсу excel из потока bgnd. Когда поток завершит свою работу, вам нужно каким-то образом вызвать метод в основном потоке пользовательского интерфейса (есть много примеров того, как обновлять основные элементы управления пользовательскими интерфейсами с помощью Invoke delegate).

+0

Hi Dgorti, Thanx для ввода. Фактически я реализовал интерфейс IMessage для обработки исключений. Не могли бы вы помочь мне с любыми ссылками, объясняющими, как вызвать основной поток из рабочего фонового потока. На данный момент я вызываю функцию sheetallivate выше через кнопку в графическом интерфейсе. Есть ли способ вызвать эту функцию из фонового потока и вызвать основной поток при этом? –

+0

Кроме того, я не могу найти никаких правдоподобных объяснений в отношении того, почему возникает эта проблема. Не могли бы вы помочь мне понять причину этой проблемы? –