【问题标题】:WPF C# Application PerformanceWPF C# 应用程序性能
【发布时间】:2012-01-11 11:51:26
【问题描述】:

我们有一个用 .Net 4.0 编写的 C# WPF 应用程序,其中一些相对简单的数据绑定和网格功能。

样式涉及一些“调整”,包括一些悬停颜色等。

在覆盖 20 台部署的 3 台机器上,我们遇到了一些非常奇怪的 UI 性能问题。

实际上,在重新启动后应用程序运行良好,但在一定(未确定的)时间后,用户界面变得异常缓慢。例如,将鼠标悬停在按钮上,在应用/呈现悬停颜色样式之前最多会有几秒钟的延迟。

这些机器的规格几乎相同。图形驱动程序已更新,标准设置是两个 NVidia Quadro 290 卡。此外,我们制作了一个“测试”应用程序,其中仅包含一些测试 UI 组件(包括 Fluent Ribbon),并且没有任何代码。问题依然存在。

我已运行 Windows 性能套件以“深入了解”运行时 WPF,而且非常奇怪的是,如果勾选“禁用脏区支持”选项,UI 会恢复正常响应。我的理解是,如果有的话,这应该会进一步降低性能!!!

我在这里找不到任何其他尝试。 DotTrace 性能分析表明,大部分应用程序时间都花在了 PresentationFramework.dll 中。

[编辑]所有机器都是 Windows XP SP3。

[编辑] 这可能发生在所有机器上,并且通常不允许应用程序运行足够长的时间来显示问题。我们现在正在对此进行测试。

[编辑] 我还应该指出,我们正在试验详细的热修复 here。目前已经安装在单机上,我会相应更新。

[编辑 - 24 小时后] 所以两台机器现在已经在一夜之间运行相同的代码。在我的机器上(从未出现过问题),初次登录后应用程序非常缓慢,但不到一分钟后又恢复正常。 (我把它归结为机器显然把东西从硬盘上拉下来了)。在另一台机器上(通常会显示问题),应用程序在几秒钟后有所改善,但与我的相比现在仍然缓慢。

[编辑 - 48 小时后] 在测试机器上,测试应用程序在运行 48 小时后现在完全没有响应(锁定)。在同一台机器上,一个轻量级的“外壳”WPF 应用程序(包含一个选项卡控件、一些按钮和一些面板和网格)仍在运行并且响应完美。所以这些更复杂的控件中的某些东西导致了这个问题......这确实指向(可能)可能是根本原因的触发器和委托。我会再次分析应用程序/控件。同时,是否有人对如何确保应用程序定期“清理”自身有任何建议?因为我们在这里查看第三方控件,所以我编辑它们的选项有限!

如果可以提供任何提示,我们将不胜感激!

【问题讨论】:

  • 可以提供代码吗?其他一些 SO'er 可能也想尝试一下。问题出现前的最短时间是多长时间?
  • 如有必要,我可以提供代码......但我们目前的测试应用程序实际上只涉及使用 Fluent Ribbon(可从 CodePlex 加载),在和空网格中。除了明显的 init 调用之外,没有其他代码。如果它能让生活更轻松,我当然会提供这个拉链。
  • 不要对原型系统抱有太大期望。作为第一步,我会检查代表的使用情况。你经常用吗?
  • 我们现在正在尝试确定最短时间。我应该很快就能给你一个更准确的答案。但是目前,如果我早上重新启动有问题的机器,该应用程序在白天运行良好,到第二天我们检查它时,这个问题就出现了。
  • @Dmitry 在这种情况下,原型系统是什么意思?没有专门设置委托,因为我们没有绑定到控件的事件/命令。 (所以除了框架在引擎盖下设置的内容之外没有其他内容)。

标签: c# wpf performance


【解决方案1】:

尝试在软件模式下渲染 wpf。

在加载事件中:

HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
HwndTarget hwndTarget = hwndSource.CompositionTarget;
hwndTarget.RenderMode = RenderMode.SoftwareOnly;

【讨论】:

  • 我试过这个。我应该指出,该问题在应用程序重新启动后仍然存在。因此,如果它运行缓慢,我尝试使用 SoftwareOnly 标志重新构建它,将其部署到目标机器,但它仍然运行缓慢。只有重新启动才能获得改进!
  • 也许在玩一些注册表设置:msdn.microsoft.com/en-us/library/aa970912.aspx
  • 我试过那个注册表设置。基本上是一种确保软件渲染发生的更有力的方法。不确定 Fluent Ribbon 和分层窗口,我会调查的。在您介绍了检查软件渲染的 2 种好方法时点赞 :)
【解决方案2】:

比较开发人员和用户计算机之间的性能时要考虑的一点是加载 WPF 程序集所需的时间。

在开发机器上,您可能已经运行了 Visual Studio,或者之前运行过其他 WPF 应用程序,并且在您运行应用程序时,程序集应该已经全部加载完毕。

在用户计算机上,可能刚重新启动,程序集将在应用程序启动时加载,从而显着降低启动速度。根据应用程序的设置方式,第一次使用各种功能/页面时可能会加载额外的程序集。

我发现EQUATEC profiler 在调试这些性能问题时很有用。在构建项目之前将应用程序选项中的分析更改为“完整常规信息”将分析到绑定级别。

【讨论】:

  • 我真的不相信这与启动时间和预加载程序集有关。就应用程序生命周期而言,这是关于长期运行的。我已经调查了blogs.msdn.com/b/jgoldb/archive/2007/10/10/… 中提到的各种与启动相关的问题
  • 此外,我在应用程序旁边运行了 Procmon,并注意到在正常操作期间没有文件加载(并且 UI 滞后)。不过,我肯定会尝试使用 EQUATEC 分析器!
  • 感谢您的链接,里面有很多我一直想知道的东西(例如“在 GAC 中放置强命名程序集”以加快启动速度)
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多