Не делайте этого - в частности, не вызывайте 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 помечает несколько из них как мусор и затем входит финализатор и запускает деструктор ... который вызывает собственный код для очистки ресурса ... но собственная библиотека может быть не поточно-безопасной здесь. Просто предположение.