在foreach循环之后处理IDisisable COM对象包装的正确方法

时间:2014-09-22 18:05:16

标签: c# foreach com idisposable rcw

foreach循环在自动实现.dispose()的对象上调用IDisposable。这是一个很好的功能,但是我们说你有以下功能:

public COMWrapper GetCOMWrapperByName(string COMWrapperName)
{
    List<COMWrapper> COMWrapperList = GetCOMWrappersFromPlace();

    foreach(COMWrapper cw in COMWrapperList)
    {
        if(cw.name == COMWrapperName)
            return cs;
    }
}

COMWrapper .dispose()方法释放了它的相关COM对象。

根据我的理解,foreach循环会在循环结束时处理每个COMWrapper,但随后在匹配COMWrapper之前离开匹配的COMWrapper。< / p>

然而,对于COMWrapperList列表中留下的COMWrapper引用,这成为一个问题,因为它们中的一半已经删除了它们的底层COM对象RCW包装器而没有被丢弃。更糟糕的是,剩余的一半列表中有完全不受管理的COM对象现在漂浮在以太网中,并且由于它们存在的List个对象已被处理掉,因此遍历{{1}变得非常困难并在.dispose()语句中适当地调用finally(毕竟,我们不想释放COM对象两次)。

是否可以确定是否已释放COM对象而未捕获ObjectDisposedException异常?是否有更好的方法来处理剩余的COM对象及其包装器?或者我可能完全误读了这种情况,需要重新评估我对COM对象的基本理解,我做错了什么?

1 个答案:

答案 0 :(得分:5)

foreach不会处理正在迭代的序列中的所有对象。它只处理 IEnumerator对象,它为您提供迭代的对象。