gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:56:13 25 4
gpt4 key购买 nike

问题:

我们有一个 Winforms 应用程序,它可以打开另一个 WPF 窗口。该窗口包含各种图标和文本,并不过分复杂。回到主窗口,winforms 窗口,它也有一个使用 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,但它们似乎都很慢。

有没有其他人遇到过这个问题/对我们的下一步有什么建议吗?

最佳答案

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

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

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

关于c# - ElementHost 大小导致 wpf 打开/加载速度慢且内存使用率高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22774663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com