首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单通道GetPhones ABMultiValue不一致

单通道GetPhones ABMultiValue不一致
EN

Stack Overflow用户
提问于 2010-02-25 23:44:40
回答 1查看 400关注 0票数 0

我正在使用以下代码从地址簿中获取电话号码。

代码语言:javascript
复制
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”

EN

回答 1

Stack Overflow用户

发布于 2010-02-26 00:00:51

不要这样做--具体地说,就是不要像那样连续调用ABPerson.GetPhones()。ABMultiView<string>包装了本机资源(这就是ABMultiValue实现IDisposable的原因。

更好的方法是:

代码语言:javascript
复制
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本机库在这里可能不是线程安全的。只是猜测而已。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2335286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档