问题描述
|
我正在使用WMI通过小型C#服务监视所有服务器,该服务创建了一堆ManagementScopes(应该监视的每个服务器一个)并定期轮询cpu负载等。
但是,偶尔会开始抛出COMExceptions,并显示消息“ RPC服务器不可用”。现在,如果它是真的,就足够了,但是我可以手动连接到服务器,如果我在同一服务器上创建新的ManagementScope,则可以毫无问题地重新连接!
但是这种方法存在一个问题:它会泄漏内存:-(
ManagementScope没有关闭,处置或类似的清理功能,并且仅在收集垃圾时会泄漏内存。根据我所有的google搜索,这是底层WMI组件的问题,因此不是.Net问题。
因此,我认为我最好的方法是解决COMException问题,而只保留原始的ManagementScope-但是,如果我在COMException之后手动在范围上调用Connect,它的确会返回true(如\“是的,我已经连接),但首先尝试从中获取数据时,它会引发另一个COMException。
我已经尝试了很多事情,但是我根本无法弄清楚为什么会发生这种情况:-(
代码很大,因此我没有将其粘贴到此处(并且分为很多类)
但基本上,我创建了一个作用域,然后调用以下方法:
public ManagementObject GetSingleObject(string query)
{
using (var searcher = CreateSearcher(query))
{
try
{
using (var collection = searcher.Get())
{
return collection
.Cast<ManagementObject>()
.FirstOrDefault();
}
}
catch
{
return null;
}
}
}
private ManagementObjectSearcher CreateSearcher(string query)
{
return new ManagementObjectSearcher(_scope,new ObjectQuery(query),_options);
}
如果您需要更多代码,请告诉我:-)解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)