我已将 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
我可以说缓慢不取决于:
- SQL Server(我已经删除了所有访问 SQL Server DB 的代码)。
- 绑定(现在根本没有绑定)。
- 开发环境:如果您从 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 文件中。
非常感谢您抽出宝贵的时间。
让我知道我能做些什么来解决这个问题。欢迎任何建议。