【发布时间】: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