C# 在foreach循环后处理IDisposable COM对象包装的正确方法
C# 在foreach循环后处理IDisposable COM对象包装的正确方法,c#,foreach,com,idisposable,rcw,C#,Foreach,Com,Idisposable,Rcw,foreach循环在自动实现IDisposable的对象上调用.dispose()。这是一个不错的功能,但假设您具有以下功能: public COMWrapper GetCOMWrapperByName(string COMWrapperName) { List<COMWrapper> COMWrapperList = GetCOMWrappersFromPlace(); foreach(COMWrapper cw in COMWrapperList) {
foreach
循环在自动实现IDisposable
的对象上调用.dispose()
。这是一个不错的功能,但假设您具有以下功能:
public COMWrapper GetCOMWrapperByName(string COMWrapperName)
{
List<COMWrapper> COMWrapperList = GetCOMWrappersFromPlace();
foreach(COMWrapper cw in COMWrapperList)
{
if(cw.name == COMWrapperName)
return cs;
}
}
public-COMWrapper-GetCOMWrapperByName(字符串COMWrapperName)
{
List COMWrapperList=GetCOMWrappersFromPlace();
foreach(COMWrapperList中的COMWrapper cw)
{
如果(cw.name==COMWrapperName)
返回cs;
}
}
而COMWrapper
的.dispose()
方法释放了它的相关COM对象
据我所知,foreach循环将在循环结束时处理每个COMWrapper
,但随后保留匹配的COMWrapper
,因为它是在到达语句结尾之前返回的
然而,对于COMWrapperList
列表中剩余的COMWrapper
引用来说,这就成了一个问题,因为其中有一半的引用在未处理的情况下已移除了其底层COM对象RCW包装。更糟糕的是,列表的另一半有完全非托管的COM对象,现在漂浮在以太网上,而且由于它们所存在的COMWrapper
对象还没有被处理,因此很难遍历列表
并在finally
语句中适当地调用.dispose()
(毕竟,我们不想两次发布COM对象)
是否有可能确定COM对象是否在未捕获
ObjectDisposedException
异常的情况下被释放?是否有更好的方法来处理剩余的COM对象及其包装器?或者可能我完全误解了这种情况,需要重新评估我对COM对象的基本理解,我做错了什么?foreach
不会处理被迭代序列中的所有对象。它只处理为您提供被迭代对象的IEnumerator
对象。foreach循环调用。dispose()对实现IDisposable automaticall的对象执行(
不。我相信它不会。)啊,我明白你的答案了now@SandyGifford枚举数将被释放,而不是集合中的每个对象。您需要更仔细地阅读链接,因为它没有说明您所声称的内容。