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