WMI导致内存泄漏(在多个线程中运行时)

时间:2011-09-22 21:40:41

标签: c# thread-safety wmi

我的问题类似于Periodical WMI Query Causes Memory Leak?,但有线程。

我正在编写一个简单的应用程序来监视来自多个服务器的进程和内存信息。但是存在内存泄漏。我已将问题简化为以下简单的控制台应用程序。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
using System.Threading;


namespace ConsoleApplication1
{
    class Program
    {
        public static void dummyQuery(string ip, string query)
        {
            ConnectionOptions connOptions = new ConnectionOptions();
            ManagementScope mgtScope = new ManagementScope(@"\\" + ip + @"\ROOT\CIMV2", connOptions);


            mgtScope.Connect();

            ObjectQuery queryo = new ObjectQuery(query);

            using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(mgtScope, queryo))
            {

                using (ManagementObjectCollection moc = searcher.Get())
                {

                }
            }
        }

        static void Main(string[] args)
        {
            Console.ReadKey();
            int times = 10000;
            for (int i = 0; i < times; i++)
            {

                Thread t = new Thread(o => dummyQuery("xxxxxxxxx", @"SELECT WorkingSetSize FROM Win32_Process WHERE name='W3WP.exe'"));
                //t.IsBackground = true;

                t.Start();

                System.Threading.Thread.Sleep(50);
            }
            Console.ReadKey();
            //GC.Collect();
            Console.ReadKey();
        }
    }
}

有没有办法安全地从线程运行WMI查询?

这是从一个更复杂的wpf应用程序中提取的,该应用程序检查许多服务器的状态,就像dummyQuery方法一样。该应用程序以与WMI调用相关的令人不安的快速速率泄漏内存。这个样本看起来没有泄漏内存(Jim Mischel有更好的方法来检查这个)。我将安装一个分析器并再次查看原始应用程序。

1 个答案:

答案 0 :(得分:3)

我知道这可能被认为是一个死线程,但当我在寻找我遇到的ManagementObjectSearcher内存泄漏问题的解决方案时,它是搜索列表的顶部。

我的应用程序是一个多线程应用程序,它在主线程上调用WMI作为初始化过程的一部分。然后,应用程序生成了多个使用WMI的线程。但是,当作为Windows服务运行时,应用程序保持内存泄漏(如果它作为标准可执行文件运行,则可以。)

在主入口点上放置[MTAThread]属性解决了问题。

相关问题