C# 联系人SearchAsync需要很长时间

C# 联系人SearchAsync需要很长时间,c#,performance,windows-phone-7,telerik,C#,Performance,Windows Phone 7,Telerik,我的问题是:我正在创建一个WP7应用程序,需要列出移动设备上的所有联系人。我知道有方法为SearchAsync和SearchCompleted事件处理程序的Contacts类 除了一个细节,这一切都在进行中;当我在手机上使用该应用程序时,搜索时间超过12秒!我正在使用数据虚拟化来快速绘制UI。我的手机里有大约400个联系人。所以问题是,SearchCompleted在长时间后被触发:( 您对如何改进此解决方案有何想法?我是否应该开始在列表框中按第一个字母(“a”、“b”…但这意味着我需要反复调用

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

除了一个细节,这一切都在进行中;当我在手机上使用该应用程序时,搜索时间超过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();
            });
 }
我存储
\u phoneContacts
,然后使用它进行过滤;在数据虚拟化过程中,在列表框上通过索引和计数来访问它

此方法与
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;
        }
public observateCollection GetContactsRange(int startIndex,int count)
{
var collection=新的ObservableCollection();
对于(变量i=startIndex;i
如果这是一个Mango设备,您有两个选项:

1) 使用后台任务将联系人信息推送到特定于应用程序的数据存储中。标准的后台任务每30分钟运行一次,执行时间约为30秒。有关后台代理的更多信息,请参见:

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


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

您的设备规格是什么?你能把你的绑定码放进去吗?我用1500个联系人试过,速度很快。你的UI忙吗?UI什么都没做。。。同时,用户可以填写搜索文本框,当联系人被加载时,在“设备内存”中过滤并绘制到用户界面只需2-3秒欢迎访问网站@Lamiq,我建议编辑您的问题,版主将对其进行审查。你试过不穿线吗?如果我正确理解了你的代码,你会产生很多昂贵的线程,尤其是在手机上。因此我编写了一个“测试”应用程序,只显示设备中所有联系人的
DisplayName
,使用
StopWatch
,然后发现SDK方法
SearchAsync
确实需要这么长的时间(a在设备中有1300多个联系人,(我忘记了电子邮件联系人))…所以最好的解决方案可能是通过字母“0”.“9”.“a”.“z”反复搜索,这样我就可以在启动后快速显示至少一些数据。。。