如何优化WPF应用程序在Windows启动时的启动速度

5
我实现了一个 WPF 应用程序,并将其注册为在 Windows 启动时启动。我的应用程序是一个简单的登录应用程序,当用户登录后会出现在图标托盘中。问题是,在 Windows 启动后,它需要大约 30 秒才能显示出来。我尝试过使用 Ngen 但效果不佳。我想避免实现一个启动画面。我希望我的 WPF 应用程序能够在 Windows 启动后“立即”出现,类似于 Windows Live Messenger。有什么方法可以减少启动时间吗?除了编写本地代码,我还有其他选择吗? 谢谢。
4个回答

2
它在计算机空闲时启动是否也需要30秒钟(即,如果您在计算机没有忙于加载Windows时通过双击启动它)?
在Windows启动期间,计算机通常会忙于很多事情,这可能导致您的应用程序变慢。那时您无能为力。
但是,以下是一些改善WPF应用程序启动的一般提示:
- 仅实例化您最初需要向用户显示的控件。 - 减少控件/窗口的复杂性。 - 不要在控件和窗口的构造函数中执行任何耗时的操作 - 即使是读取本地磁盘上的文件等无辜的操作,在磁盘正忙于其他操作(如Windows启动期间通常发生的情况)时也可能非常耗时。 - 如果网络尚未完全初始化,则Web服务调用可能需要更长的时间。 - 一个简单的解决方案是将重负工作转移到BackgroundWorker或使用异步调用来进行I/O和网络请求。
还有一项设置可以放置在app.config中,告诉运行时不要使用证书对程序集进行身份验证(此检查可能需要很长时间,特别是在冷启动时)。
<configuration>
  <runtime>
    <generatePublisherEvidence enabled="false"/> 
  </runtime>
</configuration>

在MSDN网站上有一些关于应用程序启动时间的常规提示,可以参考(链接)


1
双击启动没有问题,大约需要2秒钟启动。问题在于Windows启动时。我看到像Windows Live Messenger这样的应用程序可以立即在Windows启动时启动,但这些都是本地应用程序。在WPF中我能做到类似的事情吗? - pfongkye
查看您的启动/构造代码,寻找像磁盘I/O和网络I/O这样的内容,并将它们移动到后台线程/异步代码中。也许您的应用程序正在阻塞等待尚未由Windows初始化的网络。 - Isak Savo
@IsakSavo 实际上,简单的 WPF hello world 应用程序展示了相同的行为。 - Poma
嗯,好的。也尝试使用 "generatePublisherEvidence" 设置。我会稍微减少启动时间,但是在 Windows 启动期间可能会更慢一些。(虽然我从未见过它需要 30 秒,但谁知道呢……) - Isak Savo

1
也许这个网站对你有所帮助。它列出了一些在 Windows 登录前(如果是服务)或之后启动应用程序的选项。这些选项涉及一些注册表修改,卸载时需要撤销这些修改。

我正在运行一个可以在Windows系统托盘中工作的应用程序,并将其添加到用户初始化注册表键的链接中,使它立即启动了!谢谢。 - JMIII

0

0
使用regedit,在注册表中创建一个名为StartupDelayInMSecDWORD,路径为

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize

默认值应设置为0,但请务必仔细检查。
这可以将我的应用程序启动时间缩短约10秒钟。
注意:Serialize密钥可能不存在。
您可以右键单击“资源管理器”并选择“新建->项”来创建它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接