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
不会处理正在迭代的序列中的所有对象。它只处理IEnumerator
对象,该对象为您提供要迭代的对象。