联系人SearchAsync需要很长时间

时间:2011-11-22 18:47:36

标签: c# performance windows-phone-7 telerik

这是我的问题:我正在创建一个WP7应用程序,需要列出移动设备上的所有联系人。我知道Contacts类包含方法SearchAsyncSearchCompleted事件处理程序。

除了一个细节外,这一切都有效;当我在手机上使用该应用程序时,搜索时间超过12秒!我正在使用数据虚拟化来快速绘制UI。我的手机里有大约400个联系人。所以问题是,SearchCompleted在很长一段时间后被解雇:(

您对如何改进此解决方案有任何想法吗?我应该开始在列表框中按首字母插入联系人(“a”,“b”......但这意味着我需要重复调​​用SearchAsync)然后我该如何合并呢?

设备:三星Omnia 7

ThreadPool.QueueUserWorkItem(result =>
{
     _cachingRunning = true;
     var contacts = new Contacts();
     contacts.SearchCompleted += contacts_SearchCompleted;
     contacts.SearchAsync(string.Empty, FilterKind.None, null);
});

此方法在SearchAsync之后差不多12秒调用:

private void contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
{
            _phoneContacts = e.Results;
            Count = e.Results.Count();      

            Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    Cached = true;
                    _cachingRunning = false;
                    CachingChanged();
            });
 }

我存储_phoneContacts然后用它进行过滤;在ListBox上的数据虚拟化期间通过索引和计数访问它。

此方法与VirtualizingDataCollection(Telerik)“一起使用”并创建添加到VirtualizingDataCollection的ViewModel项。

public ObservableCollection<ExtendedContactModel> GetContactsRange(int startIndex, int count)
        {
            var collection = new ObservableCollection<ExtendedContactModel>();

            for (var i = startIndex; i < startIndex + count; i++)
            {
                var vo = ConvertToVO(_phoneContacts.ElementAt(i));
                var newContact = ConvertToExtendedContactModel(_phoneContacts.ElementAt(i), vo);

                collection.Add(newContact);
            }
            return collection;
        }

1 个答案:

答案 0 :(得分:0)

如果这是一个芒果设备,你有几个选择:

1)使用后台任务将联系人信息推送到特定于应用程序的数据存储中。标准后台任务每30分钟运行一次,大约需要30秒才能执行。有关后台代理的更多信息,请访问:Background Agents

2)如果后台代理太吓人了,你可以在进程中完成所有这些操作。当用户打开应用程序时,后台线程可以收集联系人列表并将其保存到内部存储。

虽然您需要花时间管理联系人的内部存储,但它允许您控制联系人列表,并且肯定会改善用户体验,因为他们认为联系人搜索速度非常快。