Обновление окна вывода Visual Studio

У меня есть некоторый код C#, пишущий сообщения о прогрессе в Visual Studio 2010 EnvDTE.OutputWindowPane. Код вызывается из меню Visual Studio (он находится в VSPackage).

Проблема заключается в том, что окно вывода не перерисовывается до тех пор, пока не будет завершена вся обработка, вызванная выбором меню, поэтому выходные данные отображаются сразу, а не при добавлении каждой строки. Я подозреваю, что это связано со всей обработкой, выполняемой в основном потоке, поэтому пользовательский интерфейс Visual Studio не может перерисовываться.

Есть ли способ "прокачать сообщения" в Visual Studio для обновления пользовательского интерфейса - как Application.DoEvents()? VSPackage также вставляет некоторые элементы в проект, и это, кажется, происходит "на лету" - это только окно вывода, которое, кажется, отстает.

Я проверил различные объекты DTE, не найдя кандидатов на эту функцию.

2 ответа

Решение

Извините за молчание - мне просто напомнили об этом вопросе и я решил ответить на него сам.

Я смог в значительной степени решить эту проблему, создав окно индикатора выполнения, которое появляется, когда основной поток Visual Studio отключает выполнение моего кода и не обновляет пользовательский интерфейс. Индикатор выполнения (IVsThreadedWaitDialog2) очень плохо документирован, но, похоже, работает в рабочем потоке и переводит Visual Studio в модальное состояние, пока он активен. Так что, по крайней мере, Visual Studio не выглядит так, как будто он зависает во время обработки.

Окно индикатора выполнения является тем же, которое появляется, когда Visual Studio загружает большое решение, и имеет кнопку "Отмена".

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

Перемещение обработки в рабочий поток не сработало очень хорошо, так как он выполняет общий код, который манипулирует текстом в редакторе Visual Studio, и результаты этих манипуляций были ошибочными (иногда это работало, иногда возвращалась непостижимая ошибка COM, который, казалось, зависел от времени).

Я также наконец нашел насос сообщений в Visual Studio - оболочка содержит класс CommonMessagePump. Опять же, это очень плохо документировано, и я никогда не смогу заставить его работать правильно, основываясь на имеющейся информации. В любом случае диалог прогресса решил мою проблему.

В моем случае я смог вызвать System.Windows.Forms.Application.DoEvents() сразу после записи в окно вывода, и это решило проблему.

Другие вопросы по тегам