Обновление окна вывода Visual Studio - PullRequest
1 голос
/ 01 сентября 2011

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

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

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

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

Ответы [ 2 ]

1 голос
/ 17 мая 2013

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

1 голос
/ 04 июня 2012

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

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

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

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

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

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

...