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

本文关键字:方法 包装 对象 循环 后处理 IDisposable COM foreach | 更新日期: 2023-09-27 18:23:53

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

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,因为它是在到达语句结束之前返回的。

然而,对于留在COMWrapperList列表中的COMWrapper引用来说,这就成了一个问题,因为其中一半引用的底层COM对象RCW包装已被删除,而它们自己却没有被处理掉。更糟糕的是,列表的剩余一半具有完全未托管的COM对象,这些对象现在漂浮在以太中,并且由于它们所在的COMWrapper对象尚未被处理,因此很难遍历List并在finally语句中适当地调用.dispose()(毕竟,我们不想两次释放COM对象)。

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

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

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