.Net WMI课程 - 我必须处理哪些课程?

时间:2011-07-10 05:43:14

标签: c# linq wmi idisposable

如果我使用ManagementObjectSearcher,我可以轻松地将其包装在using块中:

using (var searcher = new ManagementObjectSearcher(scope, query))
{
    // ...
}

由于the collection returned from the searcher

这一事实,处置foreach automatically calls dispose on the enumerator也很容易
using (var searcher = new ManagementObjectSearcher(scope, query))
{
    foreach(ManagementObject mo in searcher.Get())
    {
        // ...
    }
}

ManagementObject也实现了IDisposable

using (var searcher = new ManagementObjectSearcher(scope, query))
{
    foreach(ManagementObject mo in searcher.Get())
    {
        // ...

        mo.Dispose(); // ?
    }
}
  • 我是否必须处理此方案中返回的每个ManagementObject实例?
  • 如果我这样做,我该如何安全地保护它?
  • 在这种情况下,我是否仍然可以使用Linq(并且仍能正确调用Dispose)?特别是像searcher.Get().First()
  • 这样的结构

修改:更多相关问题:

  • 我是否还必须在搜索结果集合上调用Dispose
  • 搜索者怎么样?

他们都实现了自己的IDisposable方法,但似乎搜索者只从Dispose继承了Component实现;它没有添加自己的处置行为。

1 个答案:

答案 0 :(得分:3)

对于从ManagementObject个对象继承的所有内容,

System.ComponentModel.Component继承自Componentyou should call Dispose explicitly。 您可以将LINQ方法与您自己的谓词一起使用,该谓词本身会调用Dispose

var first = searcher.Get().First(x =>
                {
                    bool result = Satisfy(x);

                    if (!result)
                    {
                        x.Dispose();
                    }

                    return result;
                });

此代码相当于:

ManagementObject first = null;

foreach (var element in searcher.Get())
{
    if (Satisfy(element))
    {
        first = element;
        break;
    }
    else
    {
        element.Dispose();    
    }
}

if (first == null)
{
    throw new InvalidOperationException("No match");
}

Satisfy是您自己的方法。