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

Mer*_*ham 8 c# linq wmi idisposable

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

using (var searcher = new ManagementObjectSearcher(scope, query))
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

using (var searcher = new ManagementObjectSearcher(scope, query))
{
    foreach(ManagementObject mo in searcher.Get())
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

ManagementObject也实现IDisposable:

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

        mo.Dispose(); // ?
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 我是否必须处理ManagementObject在此方案中返回的每个实例?
  • 如果我这样做,我如何使其异常安全?
  • 有没有办法在这种情况下仍然可以使用Linq(并且仍然可以正常调用Dispose)?特别是对于像searcher.Get().First()

编辑:一些更相关的问题:

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

他们都实现了自己的IDisposable方法,虽然看起来搜索者只继承了Dispose实现Component; 它不会添加自己的处置行为.

oxi*_*min 3

ManagementObject继承自,System.ComponentModel.Component并且您应该Dispose显式调用所有从Component对象继承的对象。您可以使用LINQ带有自己的谓词的方法来调用Dispose自身:

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

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

                    return result;
                });
Run Code Online (Sandbox Code Playgroud)

这段代码相当于:

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");
}
Run Code Online (Sandbox Code Playgroud)

Satisfy自己的方法在哪里。