У меня проблема, когда я объединяю событие нажатия кнопки с асинхронным вызовом контактов на телефоне (WP7).Проблема заключается в том, что событие SearchCompleted для вызова асинхронных контактов не запускается до завершения события Click.Это приведет к бесконечному циклу в ожидании завершения асинхронного вызова.
В моем примере с упрощенным кодом у меня есть флажок и кнопка.Когда кнопка нажата, возникает событие щелчка.Если флажок установлен, то для получения всех контактов на телефоне будет выполняться асинхронный вызов SearchAsync.
Как избежать бесконечного цикла, в результате которого этот код будет вызываться, если флажок установлен:
private bool searchCompleted = false;
private Contact[] contacts;
private void button1_Click(object sender, RoutedEventArgs e)
{
Dictionary<int, string> contactList = new Dictionary<int,string>;
// ... add contacts to the contactList ...
contactList.Add(1, "a contact name");
// if CheckBox is checked add contacts from the phone Contacts
if (checkBoxContacts.IsChecked == true)
{
Contacts cons = new Contacts();
cons.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(Contacts_SearchCompleted);
cons.SearchAsync(string.Empty, FilterKind.None, null);
searchCompleted = false;
while (!searchCompleted)
{
Thread.Sleep(100);
}
int n = 1;
foreach (Contact contact in contacts)
{
contactList.Add(n, contact.DisplayName);
}
}
// .... add more namnes to the contactList from other places....
// .... do something with the contactList ....
// Navigate to the next dialog
NavigationService.Navigate(new Uri("/NextPage.xaml", UriKind.Relative));
}
private void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
{
contacts = e.Results.ToArray();
searchCompleted = true;
}