WPF:在不干扰动画性能的情况下运行任务

时间:2010-08-25 15:55:49

标签: wpf multithreading backgroundworker

我们小组阅读了广泛引用的文章http://blog.quantumbitdesigns.com/2008/07/22/wpf-cross-thread-collection-binding-part-4-the-grand-solution/,并想知道您是否有人可以帮助解决我们的问题:

团队成员有一个运行动画的WPF应用程序。问题是即使在不同的线程上执行后台任务也会导致动画抖动。问题是创建具有低优先级的常规线程无济于事,因为这些任务最终必须在UI控件中显示数据。 例如: 我们有一个控件,显示应用程序正在执行的操作的日志。 有一个单独的DLL,它有一个GetLogs方法,返回最新日志的List。 我们使用计时器激活它,每500ms应用程序获得一个新列表,最多可包含10000个条目。 日志用户控件只是一个绑定到ObservableCollection的ListView。 我们的要求是将我们收到的列表中的每个条目添加到Observable Collection。我们还检查集合是否未超过我们给出的限制(比如100000个条目)。如果它超出限制,我们删除前10000个条目。

现在这只能在UI调度程序对象中完成,因此最好的解决方案是使用BackGroundWorker。但是这个线程没有低优先级,并且不能在那里设置优先级。我们想知道这是否有帮助,因为我们的理解是线程使用Dispatcher.Invoke方法发送UI元素。

因此,对于我来说,使用Dispatcher.BeginInvoke(ThreadPriority.Low ......)将每个字符串添加到observable集合中是非常平行的。 这会使日志显示变慢,动画仍然不稳定。

对于这样一个常见问题(UI性能和后台任务)是否有开箱即用的解决方案?

2 个答案:

答案 0 :(得分:1)

Here is the link to BackgroundWorkerPrioritized Component这是一个基本的.NET Framework实现,通过传递构造函数参数来设置线程优先级。

希望这有帮助。

答案 1 :(得分:0)

我不确定你在后台线程中做了什么,但每次调用Dispatcher.BeginInvoke时,你都会在主线程上做一些事情。在你的情况下,每1/2秒,你在主UI线程中做10000件事。由于您更新了ObservableCollection,因此每次添加/删除某些内容时,您也会提升事件。

在这种情况下,我只使用一个列表,而不是使用可观察的集合。在后台线程中创建列表,然后将listview与一次Dispatcher.BeginInvoke调用绑定。