2010-08-25 29 views
1

我们的小组阅读广泛引用的文章http://blog.quantumbitdesigns.com/2008/07/22/wpf-cross-thread-collection-binding-part-4-the-grand-solution/,并想知道如果你们能与我们的问题帮助:WPF:运行任务,而不带有动画的性能干扰

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

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

因此,这是真正平行的我用Dispatcher.BeginInvoke(ThreadPriority.Low ......)将每个字符串添加到可观察集合 这会减慢日志显示加上动画仍然胡思乱想。

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

+0

仅在从后台线程获取数据并将其显示在UI上时,是否会出现抖动行为? – Nate 2010-08-25 15:58:06

+0

动画的本质是什么? – Jay 2010-08-25 15:58:27

+0

@Jay:进度指示器 – 2010-08-26 13:30:27

回答

0

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

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