【发布时间】:2011-07-22 05:25:56
【问题描述】:
我有几个长时间运行的自定义构建任务。然而,它看起来 Visual Studio 在 UI 线程上运行 msbuild 任务,这导致 IDE 挂起。
我在 google 上进行了一些搜索,我能找到的最好的结果是一些错误报告,其响应是“哦,是的,这是个问题,我们可能会稍后修复它”。
http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/3289eb7d-7989-4350-8c43-02bf9913edbd/.
因此,我决定通过以下方式为我的自定义任务修复它:
- 检测它们何时在 Visual Studio 中运行。
- 在后台线程上运行任务(如果它们是)
- 向 UI 线程添加“MsgWaitForMultipleHandles / 自定义消息泵”,以在运行时保持 UI 响应。
这似乎有效。我现在可以在 IDE 不冻结的情况下运行我的构建。
无论如何,这带来了几个问题:
这样做安全吗?视觉工作室是一个巨大的东西。如果我这样做,我会遇到任何重入问题吗?这些重入问题会导致世界末日吗,还是我可以忽略它们。
我使用this post 中概述的技术检测 Visual Studio。基本上,我将“BuildingInsideVisualStudio”属性的值分配给任务的一个属性,我在我的 Execute() 方法中检查该属性。如果是真的,那么我使用多线程行为,否则我只使用顺序行为。但是,这需要每个使用该任务的目标将额外的 goo 放入 msbuild 文件以避免糟糕。理想情况下,我希望“不吸”成为正常行为,无需特殊配置。有什么方法可以在我的任务的 Execute() 方法中检测到 Visual Studio?我可以在任务实现中读取项目属性而不需要对 XML 进行自定义编辑吗?我可以以某种方式询问 Host 对象吗?
谢谢。
【问题讨论】:
-
我读到“宇宙尽头”部分的问题,很失望
-
哇。你让你的开发者经历一个漫长的构建周期?
-
我猜这是讽刺?在任何情况下......“长时间运行”意味着当 IDE 被阻塞并且不会绘制时与它响应时不同。long 的定义可能会发生显着变化。我们的完整构建大约需要 5 分钟,这并不慢。我上一份工作的完整构建花了大约半天时间。我还参与过需要多个构建实验室才能在一天内构建产品的项目。所以,不,我们不会让我们的开发人员进行长时间的构建。但我希望从事我项目的人能够有效地使用他们的工具。没有回应 == 没有效率。
-
@ScottWisniewski 您好,您保持 MSBuild 响应的解决方法对我来说非常有价值。但是,我没有真正理解“向 UI 线程添加“MsgWaitForMultipleHandles / 自定义消息泵”的含义所需的背景知识。您能否发布一些代码(在这里,或者在一个关于如何在长时间构建期间保持 VS 响应的自我回答的问题中)?谢谢。
标签: visual-studio-2008 msbuild