【发布时间】:2013-01-22 19:45:17
【问题描述】:
我的 WPF 窗口在托管在 WPF 应用程序中时运行良好,但是当我从本机 C++ 应用程序中加载它时,渲染需要很长时间,并且 UI 线程会阻塞直到它完成。
我窗口上的主要问题是一系列项目控件,用于显示 9 x 12 的图标网格,这些图标代表我系统中组件的状态。
整个项目控件的初始渲染最多需要 14 秒。 (在 WPF 应用程序中运行时,这几乎是即时的)
每一行都有一个文本标题,单击该标题时会显示每个状态图标的小数据摘要(最大值、最小值、平均值、标准差)。单击此标题最多可能需要 4 秒来呈现摘要,但在我的 WPF 应用程序中是即时的。
是否有任何已知的技巧可以使 WPF 在本机应用程序中正常运行?
[编辑]
我刚刚尝试使用以下代码从大型 .NET Windows 窗体应用程序启动它:
public bool? ShowWpfDialog(System.Windows.Window window, Form owner)
{
var helper = new System.Windows.Interop.WindowInteropHelper(window)
{Owner = (owner == null) ? IntPtr.Zero : owner.Handle};
return window.ShowDialog();
}
我遇到了与从本机应用程序运行时相同的性能问题。 (.net 应用程序也运行本机代码。)
[编辑]
当我不使用 WindowInteropHelper 时,代码会正常执行:
public bool? ShowWpfDialog(System.Windows.Window window, Form owner)
{
//var helper = new System.Windows.Interop.WindowInteropHelper(window)
// {Owner = (owner == null) ? IntPtr.Zero : owner.Handle};
return window.ShowDialog();
}
WindowInteropHelper 做了什么会导致性能问题?
[编辑]
当我使用 WindowInteropHelper 与所有者一起加载资源时,解决资源的方式是否存在问题?
【问题讨论】:
-
你在调试器中运行/计时吗?
-
时间基于运行发布版本时的观察
-
你是在VS托管进程中运行,还是在独立/外部VS运行?
-
那是 C++/CLR 吗?我会指出互操作/线程配置的方向。线程模型可能是问题所在。您是否尝试过在 Visual Studio 中进行分析器调试以查看挂在哪里? 14 秒是一个非常多的时间 - 这应该是显而易见的。
-
许多性能问题可能与 Windows 主题、视觉样式和您运行的 Windows 版本有关。本机应用程序可以使用与内置 .NET/WPF 不同的参数启动。我建议阅读这些读数以获得想法:blogs.msdn.com/b/visualstudio/archive/2010/03/02/… 并最终使用 WPF 性能套件工具:msdn.microsoft.com/en-us/library/vstudio/…
标签: c++ wpf performance native