К сожалению, нет смысла в том, что вы делаете, это уже делается.Взаимодействие Office основано на внепроцессном COM.Как и многие COM-интерфейсы, интерфейсы Excel помечены как разделы, внесенные в реестр.Это дорогой способ сказать, что они не поддерживают потоки.
COM автоматически заботится о компонентах, которые не поддерживают многопоточность, он автоматически маршалирует вызовы, сделанные в рабочем потоке, в поток, который создал объект COM,Это должен быть поток, который является STA, как основной поток любой программы, имеющей пользовательский интерфейс.При необходимости он автоматически создаст поток STA.Одним из побочных эффектов этого маршалинга является то, что вызовы рабочих потоков автоматически сериализуются.В конце концов, поток STA может отправлять только один вызов за раз.
Еще один побочный эффект заключается в том, что взаимоблокировка не является редкостью.Что произойдет, когда поток STA остается занятым и не качает цикл сообщений.Маршалинг выполняется с помощью программного кода COM, который использует петлю сообщений для отправки вызовов.Это условие довольно легко отладить, вы должны использовать Debug + Break All, Debug + Windows + Threads и проверить, чем занят поток STA (или Main).
Также остерегайтесь попыток такого рода потоковвероятно, это 90% причины, по которой вы получаете это исключение взаимодействия.Попытка получить код, который по сути потоково-небезопасен для выполнения более чем одной вещи одновременно, просто не работает.Вы бы избежали исключения «занято» из Excel, заблокировав свой собственный код, отметив операцию, которая переводит Excel в это состояние «занято», поэтому вы откладываете другие потоки.Больно конечно делать.