【问题标题】:Refreshing Visual Studio Output Window刷新 Visual Studio 输出窗口
【发布时间】:2011-08-31 21:46:22
【问题描述】:

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

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

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

我深入研究了各种 DTE 对象,但没有找到该功能的任何候选对象。

【问题讨论】:

  • 听起来正确的解决方法是不在 UI 线程上进行处理。
  • 是的,计划是尝试将处理移至工作线程,但这需要大量时间,我担心某些 VS 接口的线程安全性如何,或者是否有线程亲和性。在已知的安全点发送消息似乎风险较小。
  • 我对您的问题感到困惑。任何 UI 更改都应该发生在 UI 线程上。您可以通过在 UI 线程上的代码中记住 dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher 来确保这一点,然后使用 dispatcher 从另一个线程执行任何 UI 更改(如果您想保证您的消息按发送顺序显示,可能需要一些额外的花哨)。

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


【解决方案1】:

抱歉让我沉默了——我刚想起这个问题,我想我会自己回答。

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多