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