刷新Visual Studio输出窗口

时间:2011-08-31 21:46:23

标签: visual-studio visual-studio-2010 envdte vspackage

我有一些C#代码将进度消息写入Visual Studio 2010 EnvDTE.OutputWindowPane。从Visual Studio菜单调用代码(它位于VSPackage中)。

问题是在菜单选择调用的所有处理完成之前,输出窗口不会重新绘制,因此输出会立即显示,而不是在添加每一行时显示。我怀疑这与主线程上执行的所有处理有关,因此Visual Studio UI无法重绘。

有没有办法在Visual Studio中“抽取消息”来更新UI - 比如Application.DoEvents()? VSPackage还会在项目中插入一些项目,这些项目似乎“在运行中” - 它只是输出窗口似乎落后了。

我在没有找到任何此功能的候选者的情况下,通过了各种DTE对象。

2 个答案:

答案 0 :(得分:1)

对于沉默感到抱歉 - 我只是想起了这个问题,我想我会自己回答。

通过创建一个进度条窗口,我可以在很大程度上解决问题,该窗口在主Visual Studio线程关闭运行我的代码而不更新UI时出现。进度条( IVsThreadedWaitDialog2 )的文档记录非常糟糕,但它似乎在工作线程上运行,并在活动时将Visual Studio置于模态状态。因此,至少可以防止Visual Studio在处理过程中看起来像挂起一样。

进度条窗口与Visual Studio加载大型解决方案时出现的窗口相同,并且可以选择“取消”按钮。

不幸的是,进度条对话框有几个错误(向Microsoft报告),其中最重要的是它经常出现在Visual Studio窗口后面 - 真的很烦人。这是一个显示停止,所以每当更新进度条时,我使用代码here的变体来按其标题定位进度窗口并将其带到Visual Studio窗口堆栈的顶部。 / p>

将处理移动到工作线程并不能很好地工作,因为它执行在Visual Studio编辑器中操作文本的共享代码,并且这些操作的结果不稳定(有时它会起作用,有时候是一个难以理解的COM错误被归还,这似乎与时间有关)。

我最终在Visual Studio中找到了一个消息泵 - shell包含一个名为 CommonMessagePump 的类。同样,它的记录非常糟糕,我根本无法根据可用的信息使其正常工作。在任何情况下,进度对话框都解决了我的问题。

答案 1 :(得分:1)

在我的情况下,我能够在写入输出窗口后立即调用System.Windows.Forms.Application.DoEvents()并解决了问题。