2011-08-31 147 views
1

我有一些C#代碼寫入進度消息到Visual Studio 2010 EnvDTE.OutputWindowPane。該代碼是從Visual Studio菜單調用的(它位於VSPackage中)。刷新Visual Studio輸出窗口

問題是,直到菜單選取所有處理完成後,輸出窗口才會重新繪製,因此輸出會一次顯示,而不是每次添加時。我懷疑這與在主線程上執行的所有處理有關,因此Visual Studio UI無法重繪。

有沒有辦法在Visual Studio中「抽取消息」來更新UI - 比如Application.DoEvents()? VSPackage還在項目中插入了一些項目,這似乎是「即時」發生的 - 它只是輸出窗口看起來滯後。

我通過各種DTE對象進行了搜索,但未找到任何此功能的候選對象。

+0

這聽起來像是正確的解決方案是隻是不做處理的UI線程。 – perelman

+0

是的,計劃是嘗試將處理移動到工作線程,但這需要大量的時間,並且我擔心線程安全的某些VS接口是否有線程關聯。在已知的安全點推送消息看起來風險較小。 – UweBaemayr

+0

我很困惑你的問題是什麼。任何UI更改都應該發生在UI線程上。你可以通過記住'dispatcher = System.Windows.Threading.Dispatcher來確保。CurrentDispatcher'在UI線程的代碼中,然後使用'dispatcher'從另一個線程執行任何UI更改(如果要保證郵件按照發送順序顯示,可能還需要一些額外的功能)。 – perelman

回答

1

對不起沉默 - 我只是想起了這個問題,並認爲我會自己回答。

我能夠很大程度上解決問題,方法是創建一個進度條窗口,當Visual Studio主線程關閉運行我的代碼並且不更新UI時出現。進度條(IVsThreadedWaitDialog2)記錄很差,但似乎在工作線程上運行,並在激活時將Visual Studio置於模態。這樣至少可以讓Visual Studio在處理過程中看起來像掛起一樣。

進度條窗口與Visual Studio加載大型解決方案時顯示的窗口相同,並且具有「取消」按鈕的選項。

不幸的是,進度條對話框有幾個bug(向Microsoft報告),其中最重要的是它經常出現在Visual Studio窗口的後面 - 真的很煩人。這是一種表現障礙,所以無論何時更新進度欄,我都會使用代碼here的變體,通過其標題找到進度窗口,並將其放到Visual Studio窗口堆棧的頂部。

將處理移動到工作線程並不能很好地工作,因爲它會執行在Visual Studio編輯器中操作文本的共享代碼,並且這些操作的結果是不穩定的(有時會起作用,有時會出現一個不可思議的COM錯誤被返回,這似乎是時間依賴性的)。

我也終於在Visual Studio中找到了一個消息泵 - 該shell包含一個名爲的類CommonMessagePump。再一次,它的記錄很差,根據可用的信息,我永遠無法完成正確的工作。無論如何,進度對話已經解決了我的問題。

1

在我的情況下,我能夠在寫入輸出窗口後立即調用System.Windows.Forms.Application.DoEvents()並解決了問題。

相關問題