立刻显示启动画面

And*_*der 4 .net c# performance splash-screen winforms

我们正在处理WinForm应用程序的慢启动(它是一个大型应用程序并具有许多控制程序集).控制组件是DevComponents.应用Ngen来防止jit编译,但加载时间略有下降.

该应用程序具有启动画面,但它仅在应用程序启动后的12秒内出现.是否有任何方法可以立即显示启动画面?

我们目前的建议是使用启动画面创建一个轻量级应用程序,在单独的进程中运行主应用程序,并在完成主应用程序初始化时关闭轻量级应用程序.

Cod*_*ray 12

您永远不会为.NET应用程序立即显示启动画面. 即使您已经使组件消除了JIT编译时间,您仍然需要等待所有.NET Framework DLL加载到内存中.这是一个非常大的框架,在冷启动时加载需要花费很多时间.你真的无法做到这一点.

微软试图尽可能地减轻痛苦.在WindowsFormsApplicationBase(它在定义Microsoft.VisualBasic命名空间,但是不要让这种吓唬你了,那是从一个C#应用程序非常有用的)提供了显示启动画面内置的机制.您所要做的就是将其SplashScreen属性设置为适当的形式,其他所有内容都在幕后处理.即使在冷启动情况下,它也经过了大量优化以获得最长的响应时间,但它仍然不会是即时的.

唯一的另一个选择是在非托管代码中编写小包装器,其唯一目的是尽快抛出启动画面,然后调用.NET应用程序开始自己启动.当然,打火机越好越好.C++是一个选项,但C可能是一个更好的选择.您需要最小化必须链接的外部库的数量,因此像MFC或Qt这样的框架肯定是不对的:您需要直接定位Windows API.

Visual Studio团队在VS 2010中做了类似的事情.他们对他们博客上提供的流程有一个非常有趣的解释:

即使Visual Studio 2010在其主窗口中使用WPF,使用WPF作为启动画面也需要我们等待CLR和WPF初始化才能在屏幕上绘制单个像素.虽然我们在.Net 4.0中对CLR和WPF启动速度进行了一些巨大的改进,但它仍然不能完全匹配原始Win32的性能.因此,选择使用原生C++代码和Win32作为启动画面.

但我不会在这里花太多时间.由于您通常应该为用户提供打开和关闭启动屏幕的选项,并且大多数用户会选择将其关闭,因此很可能很少有人会首先看到它.任何好的优化分析器都会告诉你它不值得优化.


Hug*_*h W 5

对于使用C++编写并使用本机Windows API的轻量级,可重用的启动画面组件,请参阅Stefan Olson的启动画面.Cody Gray提出的方法是从单独的非CLR过程开始,然后加载主CLR应用程序.

我必须在上一份工作中实现完全相同的东西,我可以确认方法运行良好 - 用户点击开始菜单中的程序图标和出现的启动画面之间的时间只有几毫秒,所以感觉'瞬间".