【问题标题】:Slow application startup using ClickOnce deployment使用 ClickOnce 部署的应用程序启动缓慢
【发布时间】:2016-02-11 09:12:55
【问题描述】:

我们正在使用 ClickOnce 部署我们的应用程序,我们注意到,当我们通过单击 ClickOnce 桌面图标启动应用程序时,应用程序的启动速度比直接从 .exe 启动时要慢(至少需要 30-60 秒)。 我已经看到这不是一个未知问题(Slow startup of Clickonce winforms application after update),但似乎仍未解决。 我想知道为什么会发生这种情况以及如何解决。

我只使用一台机器,所以我猜这与机器无关,与防病毒无关。

在启动过程中我注意到不同的内存管理模式:ClickOnce 部署需要更多时间,一段时间后它会释放一些内存。 我们仍在讨论 12 MB 的差异(通过 ClickOnce 为 67 MB,通过直接 .exe 为 50)。

这让我发疯了......

谢谢

【问题讨论】:

  • 您是否尝试过配置 clickonce 在应用程序启动后搜索更新?
  • 您好,感谢您的评论。不,我没试过。我认为更新搜索在第一个小弹出窗口后终止(通知用户它正在寻找更新)。我一定会试试的!
  • @Pikoh 不,性能没有变化(除了删除初始更新部分)
  • 您使用哪个 Windows 版本?也许 exe / dll 文件将被发送到在较新的 Windows 版本中默认启用的 SmartScreen 过滤器。这个过程可能需要一些时间。
  • 30-60 秒是一个很长的时间,并且消除了明显的问题。只有两种问题会导致这种延迟。网络超时时间约为 45 秒,但当您将 CO 配置为不查找更新时,应将其消除。下一个是普通瘟疫,程序员自愿安装的收缩包装恶意软件。禁用您的反恶意软件产品,然后重试。

标签: c# .net clickonce


【解决方案1】:

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

您需要通过在开发虚拟机上安装与您的客户端相同的防病毒软件来证明这一假设。如果您无法重现慢启动比较机器之间的 ProcMon 跟踪。


根据您在问题中提到的QA 中的正确答案,我相信 Hans 是在赚钱,而杀毒软件是最有可能的罪魁祸首:

我发现新部署的首次运行 .Net 应用程序的性能非常差(几分钟与几秒钟),因为用户正在运行防病毒软件,因为防病毒工具会检查新的 Jitted 程序集是否存在恶意。


请确保您使用的是 .NET Framework 3.5 SP1 或更高版本,因为“在启动方面有显着的性能改进。尤其是 WPF 应用程序”并且 3.5 SP1 包括启动画面。

启动画面可能是一种快速(临时)修复。唉,不是一个理想的解决方案。


ClickOnce 现在已经很老了,在这个领域已经有了很多进步,所以为什么不采用另一种具有不同部署机制的策略,例如 Windows Installer 和应用程序中的更新菜单。我向Install to same path when upgrading application详细说明了制作MSI安装程序的步骤。

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

另外,请从 Google 那里获得这方面的提示。您还记得 Jeff Atwood 的文章:http://blog.codinghorror.com/the-infinite-version/

如果你不使用 ClickOnce,你可以使用 NGEN AND bsdiff,甚至可能是 Google courgette


还有一些其他方法可以加快 ClickOnce 应用程序的启动速度discussed here


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

【讨论】:

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

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

如果还有其他需要研究的情况或有帮助,请告诉我。

谢谢,

【讨论】:

  • 勾选“该应用程序也可离线使用(可从开始菜单启动”),谢谢
  • 还请验证捕获的 clickonce 相关事件是什么。这可能需要一些时间来加载。抱歉,级别很高,但希望这可能会有所帮助。
  • 我没关注,clickonce 相关事件是什么?
  • 请通过此链接您将获得见解,还将了解如何自定义 clickonce 安装...msdn.microsoft.com/en-us/library/ms404263.aspx
猜你喜欢
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
相关资源
最近更新 更多