. net WMI类-我必须处理哪些

本文关键字:处理 WMI net | 更新日期: 2023-09-27 18:01:35

如果我使用ManagementObjectSearcher,我可以很容易地将其包装在using块中:

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

处理从搜索器返回的集合也很容易,因为foreach会自动在枚举数上调用dispose:

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方法,尽管搜索器似乎只继承了ComponentDispose实现;它不添加自己的dispose行为

. net WMI类-我必须处理哪些

ManagementObject继承自System.ComponentModel.Component,对于所有继承自Component的对象,您应该显式地调用Dispose。您可以将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是你自己的方法