元素主机大小会导致 wpf 打开/加载缓慢,内存使用率较高
本文关键字:缓慢 加载 内存 使用率 打开 主机 wpf 元素 | 更新日期: 2023-09-27 17:55:28
问题:
我们有一个Winforms应用程序,它可以打开另一个WPF窗口。此窗口包含各种图标和文本,并不太复杂。回到主窗口,winforms,这也有一个使用ElementHost嵌入的WPF控件(ElementHost专门设计用于使Winforms能够托管WPF控件)。但是,我们注意到,一旦此应用程序的内存使用率变得相当高,第二个 WPF 窗口可能需要相当长的时间才能打开。
我们在VS2012中做了一个小的测试应用程序,能够复制这个问题。测试应用程序将打开一个包含两个按钮的 Winforms 窗口;"添加 4GB 内存使用量"和"打开 WPF 窗口"。WPF 窗口上有一个小图标 (48*48),仅此而已。当我们添加 4Gb 内存使用量并尝试首次打开窗口时,打开窗口大约需要 7 秒。
代码:我已经通过BitBucket公开了测试应用程序和源代码。
我们发现的事情:
- 该应用程序肯定以64位运行,因为它将在32位中抛出OutOfMemoryExceptions。
- 如果没有内存使用情况,窗口将立即打开。
- 随着内存使用情况,窗口仅在第一次打开时变慢。
- 如果 WPF 窗口没有图像,它将立即打开。
- 减小 winforms 控件上的元素主机的大小,例如 1*1,窗口将立即打开。显然,这不是一个很好的解决方案,因为它没有显示我们的 WPF 控件这个大小。
- 我们应用程序中的 ElementHost 大小约为 1000*700,但我们注意到在减少 ElementHost 时有一个很大的下降点大小,所以需要这 10 秒钟,直到它到达大约350*350,此时它突然好转为再次快速。这可能依赖于计算机,也可能是某种限制。
- 从 wpf 窗口中删除图像将使其再次快速。
- 将新图像添加为资源,并在 WPF 窗口中线性减慢打开时间(例如,1 个图像 = 7 秒,2 个图像 = 14 秒)。
- 尝试确保图像的大小与显示的大小相同,因此不应调整大小,但这似乎没有任何区别。
- 尝试了不同的图像类型,.png,.tiff,.ico但它们似乎都很慢。
有没有人遇到过这个问题/关于我们的下一步可能是什么的任何建议?
在使用探查器进行更多分析后,本文似乎与我遇到的问题相同。
typeof(BitmapImage).Assembly.GetType("MS.Internal.MemoryPressure")
.GetField("_totalMemory", BindingFlags.NonPublic | BindingFlags.Static)
.SetValue(null, Int64.MinValue / 2);
不是最好的解决方案,但它绝对解决了问题。