PerformenceProgessBar和ObservableCollection

时间:2011-03-13 08:16:57

标签: silverlight collections windows-phone-7

我有一个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());
        }

2 个答案:

答案 0 :(得分:2)

这对于BackgroundWorker组件来说听起来不错。该组件将允许您在后台线程中执行昂贵的操作,因此您的UI不会挂起;同时,UI线程可以通过事件通知,因此它知道工作何时完成。

<强>更新

我一定误解了这个问题。如果您的问题是关于UI中的列表,ObservableCollection在添加大量项目时更新速度很慢,那么您可以尝试做的一件事就是构建 new ObservableCollection,用您需要的数据填充它,然后将新集合分配给UI。

我过去曾遇到ObservableCollection的问题,因为每次添加项目时都会引发一个事件,这会导致UI响应能力下降。我的解决方法是创建一个集合的子类,你可以在其中创建一个AddRange,它只引发一个事件,但只是构建一个未绑定到UI的新集合,然后在填充后绑定它是另一种选择。

答案 1 :(得分:0)

对使用ProgressBar.IsIndeterminate的一个重要警告 - 它占用了超过60%的CPU资源,并且在某些情况下会产生灾难性的影响。有关详细信息,请参阅this article