我有一个ObservableCollection,它从foreach获取数据。当对集合进行更改时,UI会更新,但随着集合大小开始增加,存在滞后。我的收藏中有大约500多个项目被删除,重新排序和添加。但我注意到,在进行更改和在UI中反映这些更改之间存在明显的滞后。下面的例子只是一个简单的例子。显然,进度条在这种情况下不会持续很长时间(几分之一秒),但我要说的是UI不会反映我为很多人所做的更改,进度条在下面停止。我可以在我的对象中捕获或实现哪些事件,这将允许我在将ObservableCollection推送到UI时添加更新进度条的代码?或者有人想给我发一张“DealWithIt”狗图片:)
a_progressbar.IsIndeterminate = true;
foreach (Group<SomeItem> sortedItem in sortedItems)
{
OList.Add(sortedItem);
}
a_progressbar.IsIndeterminate = false;
更新以下是我用来使其运行的代码。
_dataBinder = new BackgroundWorker();
_dataBinder.DoWork += new DoWorkEventHandler(DataBinderWork);
_dataBinder.RunWorkerCompleted += new RunWorkerCompletedEventHandler(DataBinderComplete);
...
private void DataBinderComplete(object sender, RunWorkerCompletedEventArgs e)
{
Dispatcher.BeginInvoke(() =>
{
a_progressbar.IsIndeterminate = false;
});
}
private void DataBinderWork(object sender, DoWorkEventArgs e)
{
Dispatcher.BeginInvoke(() => LotsOfWork());
}
答案 0 :(得分:2)
这对于BackgroundWorker组件来说听起来不错。该组件将允许您在后台线程中执行昂贵的操作,因此您的UI不会挂起;同时,UI线程可以通过事件通知,因此它知道工作何时完成。
<强>更新强>:
我一定误解了这个问题。如果您的问题是关于UI中的列表,ObservableCollection
在添加大量项目时更新速度很慢,那么您可以尝试做的一件事就是构建 new ObservableCollection
,用您需要的数据填充它,然后将新集合分配给UI。
我过去曾遇到ObservableCollection
的问题,因为每次添加项目时都会引发一个事件,这会导致UI响应能力下降。我的解决方法是创建一个集合的子类,你可以在其中创建一个AddRange
,它只引发一个事件,但只是构建一个未绑定到UI的新集合,然后在填充后绑定它是另一种选择。
答案 1 :(得分:0)
对使用ProgressBar.IsIndeterminate的一个重要警告 - 它占用了超过60%的CPU资源,并且在某些情况下会产生灾难性的影响。有关详细信息,请参阅this article。