Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF:在不影响动画性能的情况下运行任务_Wpf_Multithreading_Backgroundworker - Fatal编程技术网

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

WPF:在不影响动画性能的情况下运行任务,wpf,multithreading,backgroundworker,Wpf,Multithreading,Backgroundworker,我们小组阅读了这篇被广泛引用的文章,想知道你们中是否有人可以帮助解决我们的问题: 团队成员有一个正在运行动画的WPF应用程序。问题是,即使在不同的线程上执行背景任务,也会导致动画抖动。问题是,创建低优先级的常规线程没有帮助,因为这些任务最终必须在UI控件中显示数据。 例如: 我们有一个控件,显示应用程序正在执行的操作的日志。 有一个单独的DLL,它有一个方法GetLogs,返回最新日志的列表。 我们使用计时器激活它,每500毫秒应用程序就会得到一个新列表,其中最多可以包含10000个条目。 日志

我们小组阅读了这篇被广泛引用的文章,想知道你们中是否有人可以帮助解决我们的问题:

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

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

因此,对于我来说,使用Dispatcher.BeginInvoke(ThreadPriority.Low……)将每个字符串添加到可观察的集合中是非常并行的 这会减慢日志显示速度,加上动画仍然不稳定

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

这是一种基本的.NET Framework实现,通过传递构造函数参数设置线程优先级而得到改进


希望这有帮助。

我不确定你在后台线程中做什么,但每次你调用Dispatcher.BeginInvoke时,你都会在主线程上做一些事情。在您的情况下,每1/2秒,您就要在主UI线程中执行10000项操作。由于您更新了一个
可观测集合
,因此每次添加/删除某些内容时,您也会引发一个事件


在本例中,我不使用可观察的集合,而是使用列表。在后台线程中创建列表,然后使用一个
调度程序将listview绑定到该列表。BeginInvoke
调用。

是否只有在从后台线程获取数据并在UI上显示数据时才会出现抖动行为?动画的性质是什么?@Jay:progress indicator