【发布时间】: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