我正在使用以下代码从地址簿中获取电话号码。
ABAddressBook mybook = new ABAddressBook();
ABPerson[] allPeople = mybook.GetPeople();
foreach(ABPerson thisPerson in allPeople){
if(thisPerson.GetPhones() != null)
ABMultiValue<string> myMultiPhone = thisPerson.GetPhones();
}
}在try catch中包装代码有时是有效的,但并不总是有效。有时它会毫无问题地获取所有电话号码,有时它会随机停止获取电话号码,而try catch则会报告“获取电话号码时出错。句柄不能为空。参数名称: handle”
发布于 2010-02-26 00:00:51
不要这样做--具体地说,就是不要像那样连续调用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将其中几个对象标记为垃圾,然后终结器进入并在本机代码中运行destructor...which调用以清理resource...but本机库在这里可能不是线程安全的。只是猜测而已。
https://stackoverflow.com/questions/2335286
复制相似问题