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

时间:2014-04-01 00:27:46

标签: c# .net wpf winforms elementhost

问题:

我们有一个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秒)。
  • 通过确保图像与显示的图像尺寸相同进行实验,因此不应调整大小,但这似乎没有任何区别。
  • 使用不同的图像类型进行实验,.png,.tiff,.ico但它们似乎都很慢。

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

1 个答案:

答案 0 :(得分:4)

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

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

不是最好的解决方案,但它确实解决了问题。