Как стать автором
Обновить

C# — Использование событий в Microsoft Network Load Balancing

Время на прочтение3 мин
Количество просмотров2.5K
По работе постоянно сталкиваюсь с недостаточностью ресурсов MSDN.
Т.е., даже если общее описание довольно подробно нет почти никакой возможности пользоваться классом/технологией из-за недостатка примеров. Приходится довольно долго (иногда часами) искать по разнообразным ресурсам в Интернете для того чтобы найти разумный и прозрачный способ использования.

Одним из последних примеров у меня было использование Microsoft Network Load Balance (что это такое можно посмотреть тут) внутри C# кода. Существует множество примеров использования NLB из VB скриптов и практически нет примеров использования из managed code.

Задача: определение статуса машины (кластера) в данный момент времени.
Существующее решение: Polling – определение статуса путем запросов через WMI.
Недостаток: есть большая вероятность пропустить изменение состояния в момент самого события, недостаток информации, время затрачиваемое на считывание состояния.
Возможный подход: применение механизма «событий». Такой механизм существует, даже с примерами, но не для использования внутри кода.
Решение:

Объявление в главном методе:
«
String mePath = "\\\\localhost\\root\\MicrosoftNLB";
ManagementEventWatcher watcher1 = new ManagementEventWatcher(mePath, "SELECT * FROM MicrosoftNLB_NodeControlEvent");
watcher1.EventArrived += new EventArrivedEventHandler(watcher_NodeControlEventArrived);
watcher1.Options.Timeout = new TimeSpan(0, 0, 1);
watcher1.Start(); //need Stop!!!!!!!


* This source code was highlighted with Source Code Highlighter.

»

Описание callback для получения извещения о событии:
«
static void watcher_NodeControlEventArrived(object sender, EventArrivedEventArgs e)
{
//http://msdn.microsoft.com/en-us/library/bb736304(VS.85).aspx
  ManagementEventWatcher watcher = (ManagementEventWatcher)sender;
  Console.WriteLine(watcher.Query.QueryString.ToString());
  PropertyData property;
  if ((property = e.NewEvent.Properties["Id"]) != null)
  {
    Console.WriteLine(property.Name + ": " + property.Value);
  }
  if ((property = e.NewEvent.Properties["InstanceName"]) != null)
  {
    Console.WriteLine(property.Name + ": " + property.Value);
  }
  if ((property = e.NewEvent.Properties["Active"]) != null)
  {
    Console.WriteLine(property.Name + ": " + property.Value);
  }
  if ((property = e.NewEvent.Properties["AdapterGuid"]) != null)
  {
    Console.WriteLine(property.Name + ": " + property.Value);
  }
  if ((property = e.NewEvent.Properties["ClusterIPAddress"]) != null)
  {
    Console.WriteLine(property.Name + ": " + property.Value);
  }
  if ((property = e.NewEvent.Properties["HostPriority"]) != null)
  {
    Console.WriteLine(property.Name + ": " + property.Value);
  }
}


* This source code was highlighted with Source Code Highlighter.

»

Комментарии:
Вместо «MicrosoftNLB_NodeControlEvent» можно получать и другие события – полный список тут: «Network Load Balancing WMI Classes» и соответственно считывать property из структур событий.

П.С. Это моя «проба пера». Надеюсь получить отзывы о полезности и оформлении или наоборот – о неуместности подобных постов на Хабре. Спасибо.
Теги:
Хабы:
Всего голосов 23: ↑14 и ↓9+5
Комментарии4

Публикации

Истории

Работа

.NET разработчик
74 вакансии

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область