问题:
我们有一个 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,但它们似乎都很慢。
有没有其他人遇到过这个问题/对我们的下一步可能有什么建议?