1

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

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

有没有办法在 Visual Studio 中“发送消息”来更新 UI——比如 Application.DoEvents()?VSPackage 还在项目中插入了一些项目,这似乎是“即时”发生的——它只是看起来落后的输出窗口。

我深入研究了各种 DTE 对象,但没有找到任何适合此功能的对象。

4

2 回答 2

1

对不起,我只是想起了这个问题,我想我会自己回答。

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

进度条窗口与 Visual Studio 加载大型解决方案时出现的窗口相同,并且具有取消按钮选项。

不幸的是,进度条对话框有几个错误(已报告给 Microsoft),其中最重要的是它经常出现在 Visual Studio 窗口的后面——真的很烦人。这是一种显示停止器,因此每当更新进度条时,我都会使用此处的代码变体通过标题定位进度窗口并将其置于 Visual Studio 窗口堆栈的顶部。

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

我也终于在 Visual Studio 中找到了一个消息泵——外壳包含一个名为CommonMessagePump的类。同样,它的文档记录很差,根据可用的信息,我永远无法让它正常工作。无论如何,进度对话框已经解决了我的问题。

于 2012-06-04T16:09:30.307 回答
1

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

于 2013-05-17T19:35:50.297 回答