Вызовы API ExcelDna C из асинхронного окна WPF, выполняющегося в потоке, отличном от Excel - PullRequest
0 голосов
/ 25 октября 2019

У меня есть асинхронное окно WPF, работающее поверх Excel в отдельном потоке. Я пытаюсь использовать вызовы API C, встроенные в библиотеку ExcelDna.Utilities, чтобы получить доступ к большим объемам данных, разбросанным по различным книгам / таблицам Excel.

Любой попытка вызова выдает ошибку, которую я предполагаюпотому что он работает в другом потоке и не получает доступ к потоку, запущенному в Excel, чтобы получить объект Application.

Когда я пытаюсь сделать то же самое с помощью макроса (метод ac #, вызываемый кнопкой ленты), он работает сбез проблем. Это первая подсказка, чтобы убедиться, что это проблема с потоками.

Я новичок в многопоточности, но, насколько я знаю, я должен вызывать его из объекта Dispatcher. Проблема в том, что я не могу придумать, как это сделать.

Мои предположения верны, или есть еще одна вещь, которую я просто пропускаю? Если так, как получить доступ к '' ExcelDna.Utilities.XLApp '' из Dispatcher?

ExcelDna.Utilities.Workbook[] workbooks = ExcelDna.Utilities.XLApp.Workbooks;

Кстати, Office.Interop работает в потоке окна, но это не вариант для меня.

1 Ответ

0 голосов
/ 27 октября 2019

Вы можете запланировать выполнение кода в главном потоке в макро-контексте, где безопасно вызывать C API, с помощью помощника Excel-DNA ExcelAsyncUtil.QueueAsMacro.

...