【发布时间】:2014-09-22 18:05:15
【问题描述】:
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 包装器已被删除,而它们本身并未被处理掉。更糟糕的是,列表的 REMAINING 一半现在完全不受管理的 COM 对象漂浮在以太中,并且由于它们存在的 COMWrapper 对象尚未被处理,因此遍历 List 并调用 @987654334 变得非常困难@ 在finally 语句中适当地使用@(毕竟我们不想释放 COM 对象两次)。
是否可以在不捕获ObjectDisposedException 异常的情况下确定是否已释放 COM 对象?有没有更好的方法来处理剩余的 COM 对象及其包装器?或者也许我完全误读了这种情况,需要重新评估我对 COM 对象的基本理解,我做错了什么?
【问题讨论】:
-
foreach loops call .dispose() on objects which implement IDisposable automaticall不,它没有。 -
我相信是的 (Link)
-
啊,我现在看到你的答案了
-
@SandyGifford enumerator 将被释放,而不是集合中的每个对象。
-
您需要更仔细地阅读该链接,因为它并没有说明您所声称的内容。
标签: c# foreach com idisposable rcw