【问题标题】:Proper way to Dispose of IDisposable COM Object Wrappers After foreach Loop在 foreach 循环之后处理 IDisposable COM 对象包装器的正确方法
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 2011-07-05
    • 2013-11-18
    • 2013-03-21
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多