2011-07-21 96 views
1

我有幾個長時間運行的自定義構建任務。但是,它看起來是Visual Studio,它在UI線程上運行msbuild任務,導致IDE掛起。Msbuild問題

我在谷歌上搜索了一下,我發現的最好的東西是一些錯誤報告,其中包含響應「哦,是的,這是一個問題,我們稍後可能會修復它」。

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/

所以,我決定修復它爲我的自定義任務:

  1. 當他們的Visual Studio中運行檢測。
  2. 在後臺線程上運行任務(如果它們是
  3. 向UI線程添加「MsgWaitForMultipleHandles/Custom消息泵」以在運行時保持UI響應。

這似乎工作。現在我可以運行我的版本而不會凍結IDE。

在任何情況下,這帶來了幾個問題:

  1. 這是安全的呢?視覺工作室是一個巨大的事情。如果我這樣做,我會遇到任何重入問題嗎?這些重入問題會導致世界的結束,還是我可以忽略它們而忽略它們。

  2. 我使用this post中列出的技術檢測Visual Studio。基本上,我將「BuildingInsideVisualStudio」屬性的值分配給任務中的一個屬性,我在Execute()方法中檢查該屬性。如果這是真的,那麼我使用多線程行爲,否則我只是使用順序行爲。然而,這要求每個使用該任務的目標將額外的goo放入msbuild文件中以避免糟糕。理想情況下,我希望「不吸吮」是沒有特殊配置的正常行爲。有什麼方法可以檢測我的任務的Execute()方法中的visual studio嗎?我可以在任務實現中讀取項目屬性而無需自定義編輯XML嗎?我可以以某種方式詢問主機對象嗎?

謝謝。

+1

我讀了「宇宙的盡頭」部分的問題,disapointed –

+0

哇。你讓你的開發者經歷一個長時間的構建週期? –

+0

我猜這是諷刺嗎?在任何情況下....「長時間運行」意味着當IDE被阻塞時,不會畫的東西與它響應時的畫面不同。長的定義可能會發生顯着變化。我們的完整版本需要大約5分鐘,這並不慢。我上一份工作的完整版本花了大約半天時間。我也參與了一些需要幾個構建實驗室來在一天內構建產品的項目。所以,不,我們不會讓我們的開發人員進行長時間的構建。但是我希望在我的項目上工作的人能夠高效地使用他們的工具。沒有響應==沒有生產力。 –

回答

1

嘗試將環境變量MSBuildNoInProcNode設置爲1,然後啓動IDE。這將強制IDE構建請求到子節點。請注意,這不是一個完全測試的情況,所以可能會有一些意外的行爲,但它可能是獲得所需結果的替代方案,而無需更改項目文件或所有自定義任務。

+0

感謝您的建議。我所有的自定義任務都有一個通用的基類,所以我只需要在一個地方對任務進行更改。 理想情況下,我想避免以不同於普通的方式啓動visual studio(這比添加goo到xml更容易忘記)。 –