代码之家  ›  专栏  ›  技术社区  ›  Mr. T.

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

  •  1
  • Mr. T.  · 技术社区  · 14 年前

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

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

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

    所以这对我来说确实是平行的,用dispatcher.begininvoke(threadpriority.low_____)将每个字符串添加到可观察的集合中。 这会减慢日志显示速度,而且动画仍然很古怪。

    对于这种常见问题(UI性能和后台任务),是否有现成的解决方案?

    2 回复  |  直到 9 年前
        1
  •  1
  •   Eugene Cheverda    14 年前

    Here is the link to BackgroundWorkerPrioritized Component 它是通过传递构造函数参数来设置线程优先级而改进的.NET框架基本实现。

    希望这有帮助。

        2
  •  0
  •   Crono    9 年前

    我不知道你在后台做什么,但每次你打电话 Dispatcher.BeginInvoke 你做的事情又回到了正题上。在您的例子中,每1/2秒,您在主UI线程中做10000件事情。自从你更新了 ObservableCollection ,每次添加/删除某些内容时也会引发事件。

    在本例中,我不使用可观察的集合,而是使用一个列表。在后台线程中创建列表,然后将ListView与之绑定 调度员BeginInvoke 打电话。