У меня есть несколько долго выполняющихся пользовательских задач сборки. Похоже, Visual Studio выполняет задачи msbuild в потоке пользовательского интерфейса, что приводило к зависанию среды IDE.
Я немного поискал в Google, и лучшее, что я смог найти, было несколько сообщений об ошибках с ответом "о да, это проблема, мы, возможно, исправим ее позже".
http://connect.microsoft.com/VisualStudio/feedback/details/670873/visual-studio-ui-freezes-during-long-msbuild-task
http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/3289eb7d-7989-4350-8c43-02bf9913edbd/.
Итак, я решил исправить это для своих пользовательских задач:
- Обнаружение, когда они работают внутри Visual Studio.
- Запуск задач в фоновом потоке, если они
- Добавление «потока сообщений MsgWaitForMultipleHandles / Custom» в поток пользовательского интерфейса, чтобы пользовательский интерфейс реагировал во время работы.
Кажется, это работает. Теперь я могу запускать свои сборки без зависания IDE.
В любом случае, это подняло несколько вопросов:
Это безопасно сделать? Визуальная студия - это масштабная вещь. Буду ли я сталкиваться с проблемами повторного входа, если я сделаю это? Приведут ли эти проблемы с повторным входом к миру, или я смогу игнорировать их?
Я обнаружил Visual Studio, используя технику, описанную в этого поста . По сути, я назначаю значение свойства «BuildingInsideVisualStudio» свойству задачи, которое я проверяю в своем методе Execute (). Если это правда, то я использую многопоточное поведение, в противном случае я просто использую последовательное поведение. Это, однако, требует, чтобы каждая цель, использующая задачу, добавляла лишний goo в файл msbuild, чтобы избежать неудач. В идеале я хотел бы, чтобы «не сосание» было нормальным поведением, без специальной настройки. Есть ли какой-нибудь способ определить визуальную студию в методе Execute () моей задачи? Можно ли прочитать свойство проекта в реализации задачи, не требуя пользовательских изменений в XML? Можно ли как-нибудь опросить объект Host?
Спасибо.