如果我使用的是 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实现;它不会添加自己的处置行为。

    最佳答案

    对于从ManagementObject对象继承的所有对象,System.ComponentModel.Component继承自Disposeyou should call Component 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是您自己的方法。

    关于c# - .Net WMI类-我必须处理哪些类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6639451/

    10-13 06:41