C# WMI内存泄漏解决方案

C# WMI内存泄漏解决方案,c#,memory-leaks,wmi,C#,Memory Leaks,Wmi,我有一个调用WMI管理对象并序列化结果的静态方法。它工作得很好,但它像筛子一样泄漏内存。每次我运行它大约20 K。(即使所有序列化都已关闭) 我在.NET2.0、3.0、3.5中进行了测试,内存泄漏在整个过程中都是恒定的 我做错什么了吗?或者有没有一种方法可以把这个方法框起来,这样一旦它泄漏了什么,当它完成时就会被扔掉。(就像在子进程中装箱) 使用(ManagementObjectSearcher search=新的ManagementObjectSearcher(查询)) { 尝试 { 使用(

我有一个调用WMI管理对象并序列化结果的静态方法。它工作得很好,但它像筛子一样泄漏内存。每次我运行它大约20 K。(即使所有序列化都已关闭)

我在.NET2.0、3.0、3.5中进行了测试,内存泄漏在整个过程中都是恒定的

我做错什么了吗?或者有没有一种方法可以把这个方法框起来,这样一旦它泄漏了什么,当它完成时就会被扔掉。(就像在子进程中装箱)

使用(ManagementObjectSearcher search=新的ManagementObjectSearcher(查询))
{
尝试
{
使用(ManagementObjectCollection moList=searcher.Get()){
foreach(moList中的管理对象mo)
{
尝试
{
//在此处执行序列化。返回对象将是列表
}
捕获(例外情况除外)
{
调试错误(ex);
}
最后
{
如果(mo!=null)
{
试试{
mo.Dispose();
}
捕获{}
}
}
}
}
}
捕获(例外情况除外)
{
调试错误(ex);
}
}

放弃由
mo.Dispose()引发的所有异常。这可能会吞噬有用的信息。@Tobias-I添加了捕获代码,mo.Dispose()@AndrewBarber-yes没有抛出异常,单位为KB。尽管mo.Dispose()没有抛出异常,但实际数量差别很大。在这里,最好不要捕获并默默地吞下异常,因为这在理论上可能会造成内存泄漏。只是出于兴趣,您是否注册了与此代码相关的任何事件处理程序而没有取消订阅?它是否真的存在泄漏,我的意思是,如果您称自己为垃圾收集器(只是为了测试),它没有被释放?您是进行身份验证还是使用令牌安全性?
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
         {
             try
             {

                 using(ManagementObjectCollection moList = searcher.Get()){
                     foreach (ManagementObject mo in moList)
                     {
                         try
                         {
                             // Do serialization here.  Return object will be a List<GenereicObjectType>

                         }
                         catch (Exception ex)
                         {
                             Debug.Error(ex);
                         }
                         finally
                         {
                             if (mo != null)
                             {
                                 try { 
                                     mo.Dispose(); 

                                 }
                                 catch { }
                             }
                         }
                     }
                 }

             }
             catch (Exception ex)
             {
                 Debug.Error(ex);
             }

         }