使用ClickOnce部署的应用程序启动缓慢

12
我们正在使用ClickOnce部署应用程序,并且我们注意到当我们通过单击ClickOnce桌面图标启动应用程序时,与直接从.exe启动的情况相比,应用程序启动较慢(需要至少30-60秒)。 我看到这不是一个未知的问题(Slow startup of Clickonce winforms application after update),但似乎尚未解决。 我想知道为什么会发生这种情况以及如何修复它。
我只使用一台机器,所以我想这不是与机器或杀毒软件有关的问题。
在启动过程中,我注意到了不同的内存管理模式:ClickOnce部署需要更多时间,一段时间后会释放一些内存。 我们仍在讨论12 MB的差异(通过ClickOnce为67MB,通过直接 .exe 为50MB)。
这让我疯狂......
谢谢

3
你尝试过配置ClickOnce,使其在应用程序启动后搜索更新吗? - Pikoh
嗨,谢谢评论。 不,我还没有尝试过。我认为寻找更新会在第一个小弹窗(提示用户正在查找更新)之后终止。 我一定会尝试的! - Massimo
@Pikoh 没有性能上的更改(除了删除初始更新部分)。 - Massimo
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Massimo
1
30-60秒是非常长的时间,可以排除显而易见的问题。只有两种问题可能会导致这样的延迟。网络超时约为45秒,但当您配置CO不寻找更新时,应该消除这些问题。接下来是常见的瘟疫,程序员自愿安装的捆绑恶意软件。请禁用您的反恶意软件产品,然后再试一次。 - Hans Passant
显示剩余2条评论
2个回答

3

我猜这与机器无关,也与防病毒软件无关。

你需要通过在开发虚拟机上安装与客户端相同的反病毒软件来证明这个假设。如果你无法重现缓慢启动问题,请比较两台机器之间的ProcMon跟踪结果。


我认为Hans说得对,反病毒软件很可能是罪魁祸首,正如你在问题中提到的 QA正确答案所示:

如果用户正在运行反病毒软件,则我曾经看到过新部署的首次运行.Net应用程序的非常差的性能(几分钟 vs 几秒钟),因为反病毒工具会检查新的Jitted程序集是否存在恶意。


确保您使用的是.NET Framework 3.5 SP1或更高版本,因为“在启动领域有显著的性能提升。特别是对于WPF应用程序”,而且3.5 SP1包括闪屏界面。
闪屏界面可能是一个快速(临时)解决方案。但遗憾的是,这不是一个理想的解决方案。

ClickOnce现在已经相当老了,在这个领域已经有了很多进展,为什么不采用另一种部署机制的策略,比如Windows Installer和应用程序中的更新菜单。我详细介绍了如何创建MSI安装程序以便在升级应用程序时安装到同一路径

如果您想让每个人都使用最新版本而不是ClickOnce,则最好在启动时有一个Web服务应用程序进行ping,并在发布新版本时下载和执行更新。

此外,在这个领域可以从Google获得一些提示。你还记得Jeff Atwood的文章吗:http://blog.codinghorror.com/the-infinite-version/

enter image description here

如果您不使用ClickOnce,您可以使用像NGEN和bsdiff这样的东西,甚至可能是Google courgette

还有其他一些方法可以加快ClickOnce应用程序的启动在这里讨论


虽然这可能不能直接回答你的问题,但希望它能让你思考如何确定根本原因和/或使用更加现代化的方法来推出更新。

你好,非常感谢您的回答和欢迎,但是我仍然找不到当我单击桌面 ClickOnce 图标时正在执行什么操作。ClickOnce 应用程序在单击和执行 .exe 之间采取的操作,以及它在部署的位置。我在桌面 Win7 PC 上测试了 ClickOnce 部署,禁用了所有可能的防病毒软件和 Windows UAC,但问题仍然存在。是什么导致了两种模式之间的不同内存负载(因此我猜测是速度差异)?不幸的是,我无法更改部署方法 :(。 - Massimo
安装后,可以确认通过 CO 桌面图标启动时间更快吗?您可以使用 CLR 分析器并检查 Gen2 中的大块来查看那 12mb,如果这不是您已经使用的确定额外内存分配的方式。 - Jeremy Thompson
另外,在应用程序第二次运行(安装后)时,打开应用程序时是否有大量的IO操作?您可以使用ProcessMonitor的FileMon跟踪来查看IO活动。愚蠢的问题,但您是否已经为所有DLL和EXE设置了版本号?它不是使用通配符进行构建编号的,没有CD吧? - Jeremy Thompson
嗨Jeremy,我有一些空闲时间来调查这个问题(抱歉让你等待了,但我们要进行生产... :)),我发现30秒的差异是由于我们正在部署的Prism.Unity WPF应用程序中的“InitializeModules”函数引起的。 我使用的是5.0.1版本,但似乎找不到任何正确的PDB文件来进一步调查故障点。 我仍然想知道为什么ClickOnce会在更新检查过程后干扰加载时间(我猜它会检查Unity尝试加载的dll)。 - Massimo

0

当您发布构建时,请选择在离线模式下运行应用程序的选项。否则,ClickOnce安装程序将尝试从您的服务器而不是本地exe启动应用程序。

如果还有其他情况需要考虑,请告诉我或者这对您有所帮助。

谢谢,


检查项“应用程序也可离线使用(可从开始菜单启动)”已经被选中。谢谢。 - Massimo
请确认已捕获了哪些与 ClickOnce 相关的事件。这可能需要一些时间来加载。非常抱歉,这个级别很高,但希望这可以帮助到您。 - Sathik Khan
我不明白,ClickOnce 相关的事件是什么? - Massimo
请访问此链接,您将了解如何定制ClickOnce安装并获得深入的见解... https://msdn.microsoft.com/zh-cn/library/ms404263.aspx - Sathik Khan

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