【问题标题】:Getting around the WPF rendering bottleneck绕过 WPF 渲染瓶颈
【发布时间】:2010-08-18 00:15:24
【问题描述】:

我喜欢制作高效的应用程序,并且经常寻求并发和多线程来提高应用程序的响应能力等,但最近我的尝试似乎总是被 WPF 的单线程性所阻止。无论我的代码多么高效和并行,WPF 似乎不断地停止我的 UI 并使我的应用程序看起来非常无响应——有时等待窗口呈现可能需要宝贵的几秒钟(甚至鼠标光标都不会移动)。我觉得这很令人沮丧,因为我似乎无法加快速度。

那么,我的问题是,是否我可以做些什么来提高我的 WPF 应用程序的响应能力?我的窗口在样式和组成上往往相当复杂,而且我已经在使用虚拟化 StackPanel。

为了说明我的问题:我有一个用作搜索框的文本框,我希望在用户键入时即时显示结果(每个结果都封装在 UserControl 中并显示在 ItemsControl 中)。我正在使用后台线程来执行搜索。问题是,当 WPF 呈现搜索结果时,UI 会完全停止,因此输入会在 WPF 流失时一次冻结几秒钟,从而使整个“输入时的结果”变得不太可行。

有什么方法可以避免在 WPF 呈现时 UI 线程停止?

【问题讨论】:

  • 这听起来不对,你能不能让应用做所有的工作,产生所有的搜索结果,但最后总是显示一个空列表?这样你就可以看到它是否真的与渲染相关。此外,跨线程通信有很多开销,您是否总是将整个列表传递回 UI 线程,以便在一次调用中进行渲染? (在后台线程中将项目添加到集合中,然后发送单独的通知会降低你的性能)
  • 嗯,你可能正在做某事。当我禁用修改结果列表时,仍然存在一些不应该发生的明显滞后。我会调查一下——谢谢你的想法。
  • 谢谢 Nir——你的想法最终确定了 UI 线程上发生的重大减速,这是我以前没有注意到的。将其移至搜索线程大大提高了响应能力。所以事情并没有乍看起来那么糟糕。 :)
  • WPF实际上涉及两个线程:UI线程和渲染线程。这样做正是为了避免呈现阻塞 UI。值得运行性能分析器来查看 UI 线程是否存在瓶颈。

标签: .net wpf performance optimization


【解决方案1】:

鉴于您已经在使用线程来获取数据,我只能推测返回的数据集大到足以导致速度下降。 (您能提供一些指标吗?)例如,您可能有一个线程获取一个名称数组,但如果结果有很多,那么当您绑定时肯定会影响性能。

我能想到的唯一策略是缩小从线程返回的结果(如果您正在使用 Sql Server,则使用 TOP sql 子句),或者,如果您确实需要显示所有返回的数据, 将流分解成块,这样 UI 就不必一次渲染尽可能多的数据。后一种选择会相当复杂,可能需要从头开始创建或至少覆盖 UI 控件。

【讨论】:

  • 结果的数量有数百个,比如 300 个。最重要的是,我正在使用 VirtualizingStackPanel,所以它一次只能渲染一打或两个,但它仍然足够慢以进入用户输入的方式。
  • 哎呀,太可怕了。哪个版本的框架。如果您不使用 4.0,它被吹捧为具有巨大的性能改进。此外,如果不是渲染,那么它一定是导致减速的绑定。
  • 我使用的是 4.0,最初我确实注意到了一些改进,但还不足以解决这个问题。现在我不确定是什么导致了问题,尽管我使用了 lot 绑定。
  • 如果您在模型更改时重新绑定整个视图,也许您可​​以尝试使用更细粒度的方法进行绑定?这可能需要大量重构,但我不知道还有什么方法可以改善这种情况。
  • 我想我可以将一些绑定逻辑移动到类本身中,并在初始化和/或某些依赖项更改时手动执行它。这对我来说似乎很讽刺,因为我认为绑定应该让我摆脱这一切! :)
猜你喜欢
  • 2021-09-13
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
相关资源
最近更新 更多