Извините за молчание - мне просто напомнили об этом вопросе и я решил ответить на него сам.
Мне удалось в значительной степени решить эту проблему, создав окно индикатора выполнения, которое появляется, когда основной поток Visual Studio отключает выполнение моего кода и не обновляет пользовательский интерфейс. Индикатор выполнения ( IVsThreadedWaitDialog2 ) очень плохо документирован, но, похоже, работает в рабочем потоке и переводит Visual Studio в модальное состояние, пока он активен. Так что, по крайней мере, Visual Studio не будет выглядеть так, как будто он зависает во время обработки.
Окно индикатора выполнения является тем же, которое появляется, когда Visual Studio загружает большое решение, и имеет кнопку «Отмена».
К сожалению, в диалоговом окне индикатора выполнения есть несколько ошибок (о которых сообщается в Microsoft), наиболее значительным из которых является то, что он часто появляется за окном Visual Studio - действительно раздражает. Это своего рода ограничитель показа, поэтому всякий раз, когда индикатор выполнения обновляется, я использую вариант кода здесь , чтобы найти окно прогресса по его заголовку и перенести его на вершину стека окон Visual Studio. .
Перемещение обработки в рабочий поток работало не очень хорошо, поскольку он выполняет общий код, который манипулирует текстом в редакторе Visual Studio, и результаты этих манипуляций были ошибочными (иногда это работало, иногда непостижимая ошибка COM). был возвращен, который, казалось, зависел от времени).
Я также наконец нашел насос сообщений в Visual Studio - оболочка содержит класс с именем CommonMessagePump . Опять же, это очень плохо документировано, и я никогда не смогу заставить его работать правильно, основываясь на имеющейся информации. В любом случае диалог прогресса решил мою проблему.