ElementHost大小导致wpf打开/加载速度慢,内存使用率高

问题:

我们有一个Winforms应用程序,可以打开另一个WPF窗口。 此窗口包含各种图标和文本,并不过分复杂。 回到主窗口,winforms one,这也有一个使用ElementHost嵌入的WPF控件(ElementHost专门设计用于使Winforms能够托管WPF控件)。 但是,我们注意到,一旦此应用程序的内存使用率变得非常高,第二个WPF窗口可能需要相当长的时间才能打开。

我们在VS2012中做了一个小型测试应用程序,可以复制问题。 测试应用程序打开一个Winforms窗口,其中有两个按钮; “添加4GB内存使用”和“打开WPF窗口”。 WPF窗口上有一个小图标(48 * 48),就是这样。 当我们添加4Gb内存使用并尝试第一次打开窗口时,打开窗口大约需要7秒钟。

代码:我已经通过BitBucket公开了测试应用程序和源代码。

我们发现的事情:

  • 该应用程序肯定以64位运行,因为它将以32位方式抛出OutOfMemoryExceptions。
  • 没有内存使用,窗口立即打开。
  • 使用内存时,窗口在第一次打开时才会很慢。
  • 如果WPF窗口没有图像,则会立即打开。
  • 减小winforms控件上的elementhost的大小,比如1 * 1,窗口立即打开。 显然这不是一个很好的解决方案,因为它没有显示我们的大小这样的WPF控件。
  • 我们的应用程序中的ElementHost大小约为1000 * 700,但我们注意到在减少ElementHost大小时有一个很大的下降点,因此需要10秒,直到它达到350 * 350左右,此时突然改善再快。 这可能取决于计算机,也可能是某种限制。
  • 从wpf窗口中删除图像将使其再次快速。
  • 添加新图像作为资源,并在WPF窗口上,线性地减慢打开时间(例如,1图像= 7秒,2图像= 14秒)。
  • 通过确保图像与显示的大小相同进行实验,因此不应该resize,但这似乎没有任何区别。
  • 用不同的图像类型进行实验,.png,.tiff,.ico但它们似乎都很慢。

有没有其他人遇到过这个问题/关于我们下一步可能是什么的任何建议?

在使用分析器进行更多分析之后,本文似乎与我遇到的问题相同。

 typeof(BitmapImage).Assembly.GetType("MS.Internal.MemoryPressure") .GetField("_totalMemory", BindingFlags.NonPublic | BindingFlags.Static) .SetValue(null, Int64.MinValue / 2); 

不是最好的解决方案,但它肯定解决了这个问题。