Monotoch GetPhones ABMultiValue Несогласованный - PullRequest
0 голосов
/ 25 февраля 2010

Я использую следующий код для получения номеров телефонов из адресной книги.

ABAddressBook mybook = new ABAddressBook();
ABPerson[] allPeople =  mybook.GetPeople();
foreach(ABPerson thisPerson in allPeople){


      if(thisPerson.GetPhones() != null)
             ABMultiValue<string> myMultiPhone = thisPerson.GetPhones();

      }
}

Обтекание кода при попытке перехвата работает частично, но не всегда. Иногда он может получить все номера телефонов без проблем, а иногда он перестает получать номера телефонов случайным образом, и попытка поймать жалуется "произошла ошибка при получении телефонных номеров. Ручка не должна быть нулевой. Имя параметра: дескриптор "

1 Ответ

0 голосов
/ 25 февраля 2010

Не делайте этого - в частности, не вызывайте ABPerson.GetPhones () подряд. ABMultiView<string> оборачивает собственный ресурс (поэтому ABMultiValue реализует IDisposable .

Лучше было бы:

var mybook = new ABAddressBook();
foreach (var person in mybook.GetPeople()) {
    using (var phones = person.GetPhones()) {
        if (phones != null) {
            // do something with phones...
        }
    }
}

Это обеспечит очистку ресурсов, не полагаясь на GC для их очистки позже.

Однако я не уверен, почему ваш пример кода дает сбой. Выполнение финализатора выполняется в отдельном потоке, поэтому я предпочитаю, что, поскольку таким образом вы создаете много «мусорных» объектов (создавая два экземпляра ABMultiValue<string> для каждого человека), GC помечает несколько из них как мусор и затем входит финализатор и запускает деструктор ... который вызывает собственный код для очистки ресурса ... но собственная библиотека может быть не поточно-безопасной здесь. Просто предположение.

...