我们有一个非常复杂的软件,主要是在C#中使用.NET WinForms编写的。很多人都为此做出了贡献。其中一个贡献是在Win Forms中添加了Windows Presentation Foundation (WPF)
控件。所述控制被认为是一种通用控制,并在应用程序的许多地方使用。
几天前,当我们开始看到启动应用程序的过度延迟时,一切都运行良好。该应用程序用于在不到5分钟内启动,但现在需要20分钟才能启动。
我们一直在分析情况,但发现很难确定真正的问题。我们已经看到,我们在多个地方使用的行为不当的公共控件最终会调用以下框架函数:
系统功能执行其职责所花费的时间如上图所示。每次初始化公共控件时,系统功能大约需要1.5分钟。我们在应用程序中至少使用8次通用控件。所以,总共12分钟。
有没有其他人在WinForms上托管WPF控件时遇到过这样的问题? 任何帮助将不胜感激。
修改
我们使用的C#Dictionary存在问题。使用List<>摆脱它解决延迟问题。微软已经在最后重现了这个问题。他们正在努力。 也许,我们的应用程序将C#Dictionary带到了边缘;)
感谢大家提供的意见。
答案 0 :(得分:0)
这可能是WPF控件的初始化,而不是与ElementHost有关,或者它是在WinForms中托管的事实。
没有看到WPF UserControl的代码,很难告诉你这可能是什么,但我会说WPF / WinForms的互操作肯定是一个红色的鲱鱼。
答案 1 :(得分:0)
您可以尝试使用Ngen
:
The Native Image Generator (Ngen.exe)
是一种可提高托管应用程序性能的工具。 Ngen.exe创建本机映像,这些映像是包含已编译的特定于处理器的计算机代码的文件,并将它们安装到本地计算机上的本机映像缓存中。运行时可以使用缓存中的本机映像,而不是使用just-in-time (JIT) compiler
来编译原始程序集。
如果项目的程序集将在Ngen
的帮助下编译,则在开始应用程序和加载使用程序集的元数据之前,不需要每次都运行JIT编译器。
Ngen
将找到主程序集的所有静态依赖关系,并将它们全部编译为低级图像。这些图像将存储在程序集缓存(GAC)中,从而可以减少应用程序加载时间。