联系人搜索异步需要很长时间

本文关键字:长时间 搜索 异步 联系人 | 更新日期: 2023-09-27 18:15:22

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

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

你有什么改进这个方案的想法吗?我应该开始在列表框中插入联系人的首字母("a","b"…但这意味着我需要调用SearchAsync反复),然后我怎么能合并它?

设备:Samsung 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上进行数据虚拟化时,通过Index和Count访问。

这个方法"工作"与VirtualizingDataCollection (Telerik),并创建ViewModel项目添加到VirtualizingDataCollection

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)使用后台任务将联系人信息推送到特定于应用程序的数据存储中。标准后台任务每30分钟运行一次,执行时间约为30秒。关于后台代理的更多信息可以在这里找到:后台代理

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

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