Извиняюсь за то, что не могу опубликовать какие-либо примеры кода (я еще не смог преобразовать небольшую воспроизводимую кодовую базу, а код, который у меня есть, является проприетарным).
Моя ситуация такова: у меня есть надстройка Excel, разработанная с использованием ДНК Excel, которая извлекает данные из веб-службы REST, требующей аутентификации. Надстройка хранит учетные данные для каждого сеанса, но не сохраняется между экземплярами Excel. Также существует макрос, доступный для пользователей, который позволяет им вызывать код в надстройке для извлечения данных из веб-службы.
Проблема заключается в том, что если пользователь ранее не входил в систему, мы открываем диалоговое окно Windows Form с запросом учетных данных. Это прекрасно работает. После успешного входа в систему начинается наша логика (в одном тесте выполняется 6 одновременных запросов) для извлечения данных из веб-службы. Там немного назад и вперед (запросить данные, они неавторизованы, войти в систему, запросить снова, вытащить данные и т. д.). Если вход в систему происходит программно (форма Windows не представлена и не создается), все работает нормально.
Проблема, которую я вижу, заключается в том, что когда задействованы Windows Forms, я вижу задержку в 1 минуту 29 секунд (плюс/минус несколько долей секунды) между авторизованным запросом и получением данных. Эта задержка приводит к диалоговому окну Excel: «Microsoft Excel ожидает, пока другое приложение выполнит действие ole». Другая неприятная вещь заключается в том, что все, что мы сделали, на самом деле произошло успешно, пользователь просто получает это диалоговое окно и должен нажать «ОК» (и столкнуться с ненужной задержкой).
Все указывает на то, что задержки происходят на стороне клиента. Если я полностью удалю диалоговое окно входа в Windows Forms, мы не увидим никаких задержек, и все действия завершатся без каких-либо запросов от Excel.
По прихоти я полностью удалил код для запроса реальных учетных данных и жестко закодировал учетные данные нашей тестовой учетной записи. И это работает нормально. Если я возьму тот же самый код и просто создам пустую форму Windows, то есть new System.Windows.Forms.Form();
, и ничего с ней не сделаю, я получу точно такое же поведение в этой части наших запросов, все блокируется на 1 минуту 29 секунд. Затем наш запрос завершается успешно, но клиент получает вышеупомянутое диалоговое окно Excel.
У нас также есть точно такая же функциональность, представленная через элемент управления Ribbon, который работает нормально, только 2 отличия: 1. макросы не задействованы, 2. мы отображаем диалоговое окно прогресса, пока работа продолжается.
Мы убедились, что все элементы пользовательского интерфейса отображаются/обрабатываются в основном потоке Excel, и мы ничего не делаем для взаимодействия с Excel, кроме как в основном потоке. Никаких исключений не возникает (проверено при работе под отладчиком с прерыванием всех выброшенных исключений).
Я думал, что мы делаем что-то не так, пока я просто не создал пустую форму Windows Form (заметьте, она даже не показывалась, а просто создавалась) и не смог воспроизвести поведение.
Кто-нибудь видел это или знает, как решить?