0

我已将 60 KLOC Windows VB.NET 应用程序升级到 VS 2012 和 Windows 8。一切看起来都很好,除了我昨天将它部署到 ClickOnce 时。

如果表单使用绑定,则 ClickOnce 应用程序在第一次启动表单时加载每个表单的速度非常慢。如果表单不使用绑定(而是从数据库查询中选择数据),它们会正常加载。

最有趣的部分是,在 VS2012 中调试时,它们的加载时间不到 1 秒。从 ClickOnce 版本启动时,加载时间超过 60 秒。

如果我在 ClickOnce 应用程序中关闭这些表单之一并重新打开它,它们会在不到 1 秒的时间内正常加载。

第一次加载表单时,似乎 VS2012 中的 Binding 非常糟糕,但我更愿意认为我做错了什么。

关于这个问题的任何想法?

编辑 2013/01/18:

一天削减不必要的代码后,我已经找到了一个解决方案,它重现了缓慢并且没有不必要的代码,这样会更容易(我希望)找到其中不正常工作的地方。

ClickOnce 应用程序在这里:

http://www.octet.it/Reproduce/

源文件在这里:

http://www.octet.it/Reproduce/Reproduce.zip

我可以说缓慢不取决于:

  1. SQL Server(我已经删除了所有访问 SQL Server DB 的代码)。
  2. 绑定(现在根本没有绑定)。
  3. 开发环境:如果您从 VS2012 运行应用程序,它会按预期工作。

再现缓慢的说明:

  • 在 Windows 8 机器上安装 ClickOnce 应用程序(我的是 x64,我没有要测试的 x86)。
  • 启动任务管理器。
  • 启动“复制”应用程序。
  • 加载 MDI 表单后,点击 [Return] 键(这将触发 MDIChild 表单)。
  • 查看任务管理器,它显示了“Reproduce”应用程序如何使您机器的一个 CPU 饱和并占用大约 650 MB 的 RAM。
  • 大约 45-60 秒后,会出现一个 MDIChild 表单。
  • 关闭 MDIChild 窗体。
  • 再次点击 [Return] 并看到 MDIChild 几乎立即出现并且任务管理器显示没有 CPU 饱和或 RAM 增加

正如我所说,在 Win 8 之前,MDIChild(具有对各种表的绑定和 SQL 访问权限)大约在 2-3 秒内出现。

源文件看起来并不那么有趣:它们只会显示一个调用 MDIChild 表单的 MDIparent 表单,但如果你想做一些实验,我已经将它们包含在 .ZIP 文件中。

非常感谢您抽出宝贵的时间。

让我知道我能做些什么来解决这个问题。欢迎任何建议。

4

1 回答 1

0

你是如何编译应用程序的?您的目标是混合平台吗?尝试定位 x86。我有一个类似的问题,在我编译时通过定位 x86 解决了这个问题,除非你的应用程序中有一些疯狂的 x64 依赖项,否则它应该可以在你的 x64 机器上正常工作。请注意,这将更改 clickonce 清单,这很令人头疼,但我很好奇这是否能解决您的问题。

于 2013-06-14T03:39:53.590 回答