WMI вызывает утечку памяти (при запуске в нескольких потоках) - PullRequest
0 голосов
/ 23 сентября 2011

Мой вопрос похож на Периодический WMI-запрос вызывает утечку памяти? , но с потоками.

Я пишу простое приложение для мониторинга процесса и информации о памяти с ряда серверов.Однако есть утечка памяти.Я свел проблему к следующему простому консольному приложению.

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.Этот образец выглядит так, как будто он не пропускает память (у Джима Мишеля был лучший способ проверить это).Я установлю профилировщик и еще раз посмотрю на оригинальное приложение.

1 Ответ

3 голосов
/ 03 августа 2012

Я знаю, что это можно считать мертвой веткой, но она была первой в списке поиска, когда я искал решение проблемы утечки памяти в ManagementObjectSearcher, которая у меня была.

Мое приложение - это многопоточное приложение, которое вызывало WMI в главном потоке как часть процесса инициализации. Затем приложение порождает несколько потоков, не использующих WMI. Однако приложение продолжало пропускать память при запуске в качестве службы Windows (было нормально, если оно запускалось как стандартный исполняемый файл).

Размещение атрибута [MTAThread] на главной точке входа решило проблему.

...