Поиск контактов Async занимает много времени - PullRequest
1 голос
/ 22 ноября 2011

Вот моя проблема: я создаю приложение WP7 и мне нужно перечислить все контакты на мобильном устройстве.Я знаю, что есть класс Contacts с обработчиком событий SearchAsync и SearchCompleted.

Это все работает, за исключением одной детали;Когда я использую приложение на своем телефоне, поиск занимает более 12 секунд!Я использую виртуализацию данных для быстрого рисования интерфейса.У меня в телефоне около 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);
});

Этот метод называется почти 12секунда после SearchAsync:

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, а затем использую его для фильтрации, обращаясь к нему по Index и Count во время виртуализации данных в ListBox.

Этот метод «работает»с 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 Ответ

0 голосов
/ 24 ноября 2011

Если это устройство Mango, у вас есть несколько вариантов:

1) Используйте фоновое задание, чтобы перенести контактную информацию в хранилище данных конкретного приложения.Стандартная фоновая задача выполняется каждые 30 минут, и ее выполнение может занять около 30 секунд.Более подробную информацию о фоновом агенте можно найти здесь: Фоновые агенты

2) Если фоновый агент слишком страшный, вы можете сделать все это в процессе.Когда пользователь открывает приложение, фоновый поток может собрать список контактов и сохранить их во внутреннем хранилище.

Хотя вам потребуется потратить время на управление внутренним хранилищем контактов, это позволит вам контролировать список контактов и определенно улучшит работу пользователей, так как они будут думать, что поиск контактов очень быстрый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...