Я использую 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);
}
Если вынужно больше кода, дайте мне знать: -)