gpt4 book ai didi

c# - .Net WMI 类 - 我必须处理哪些类?

转载 作者:太空狗 更新时间:2023-10-29 19:44:30 27 4
gpt4 key购买 nike

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

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 方法,尽管搜索器似乎只是从Component 继承了Dispose 实现;它不会添加自己的处理行为。

最佳答案

ManagementObject 继承自 System.ComponentModel.Componentyou should call Dispose explicitly对于所有继承自 Component 的对象。您可以将 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com