Вот моя проблема: я создаю приложение 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;
}