C # ManagementScope теряет соединение и вызывает утечки памяти - PullRequest
1 голос
/ 20 апреля 2011

Я использую WMI для мониторинга всех наших серверов с помощью небольшого сервиса C #, который создает кучу ManagementScopes (по одному на сервер, который должен отслеживать) и периодически опрашивает загрузку процессора и т. Д.

Однако каждый разчерез некоторое время он начинает выдавать исключения COMException с сообщением «Сервер RPC недоступен».Теперь это вполне справедливо, если бы это было правдой, однако я могу вручную подключиться к серверу просто отлично, и , если я создам новый ManagementScope для того же сервера, я могу без проблем подключиться!

Однако есть проблема с этим подходом: он теряет память: - (

ManagementScope не имеет функции закрытия, удаления или подобной очистки и теряет память, когда просто собирается мусор. Это, согласно всем моим поискам в Google,проблема с базовыми компонентами WMI, и, как таковая, не проблема .Net.

Поэтому я считаю, что мой лучший подход - это решить проблему COMException и просто остаться с исходным ManagementScope - однако, если я вызову Connect вручнуюобласть действия после COMException, возвращает , возвращает true (как в «Да, у меня есть соединение), но при первой попытке получить от него данные, он генерирует еще одно COMException.

Я пробовал довольно много вещей, но я просто не могу понять, почему это происходит: - (

Код довольно большойпоэтому я не вставил его сюда (и он разбит на множество классов)

Но в основном я создаю область, а затем вызываю следующие методы:

public ManagementObject GetSingleObject(string query)
{
    using (var searcher = CreateSearcher(query))
    {
        try
        {
            using (var collection = searcher.Get())
            {
                return collection
                        .Cast<ManagementObject>()
                        .FirstOrDefault();
            }
        }
        catch
        {
            return null;
        }
    }
}

private ManagementObjectSearcher CreateSearcher(string query)
{
    return new ManagementObjectSearcher(_scope, new ObjectQuery(query), _options);
}

Если вынужно больше кода, дайте мне знать: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...