WMI通话后清理

时间:2015-11-06 16:29:21

标签: c# memory-management wmi

我们似乎遇到了一个问题,即使用WMI调用来获取远程计算机统计信息的应用程序自身没有正确清理。

呼叫的一个例子是:

    public static ManagementObjectCollection getVMs(string target, ManagementObjectCollection collection)
    {
        ConnectionOptions options = new ConnectionOptions();
        options.Authentication = System.Management.AuthenticationLevel.PacketPrivacy;
        ManagementScope scope = new ManagementScope(string.Format("\\\\{0}\\root\\virtualization", target), options);
        ManagementObjectSearcher searcher =
        new ManagementObjectSearcher(scope, new ObjectQuery("SELECT * FROM MSVM_ComputerSystem WHERE ElementName like 'TS%'"));
        try
        {
            ManagementObjectCollection ObjCollection = searcher.Get();
            collection = ObjCollection;
            return collection;
        }
        catch (Exception e)
        {
            IOModule.errorWrite(e);
            IOModule.debugWrite(e.ToString());
        }
        return null;
    }

这很好用,但随着时间的推移,我们注意到这些远程计算机正在报告过多未打开的WMI调用。

我应该在这里使用using代码的内部? Management的哪一部分需要清理?是ManagementScope ManagementObjectSearcher还是ManagementObjectCollection

1 个答案:

答案 0 :(得分:0)

最有可能是返回的集合(根据类声明判断):

public class ManagementObjectCollection : ICollection, IEnumerable, IDisposable

using应该在调用getVMs的代码中。