Потребление внутренних событий WMI - как оно обрабатывается?

Недавно я написал приложение на C# для мониторинга выбора серверных приложений, которое перезапускает их в случае сбоя.

Само приложение работает нормально. Однако у меня есть "пробел" в моих знаниях, который касается меня, и я не нашел ресурса, который бы адекватно восполнял этот пробел.

Используя мое приложение в качестве примера, я опрашиваю системный класс, который сообщает о внутренних событиях, в частности __instancecreationevent а также __instancedeletionevent используя ManagementEventWatcher и WQL-запрос.

Вот частичный (отредактированный ради краткости; удаленная обработка ошибок, код обновления пользовательского интерфейса, построитель строки запроса, таймеры перезапуска, регистраторы и т. Д.) Пример из приложения:

private void Main_Load(object sender, EventArgs e)
{
    // _watchers[0] holds "__InstanceCreationEvent" watcher

    _watchers[1] = new ManagementEventWatcher(new WqlEventQuery("__InstanceDeletionEvent", new TimeSpan(0,0,5), "TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = 'application.exe'"));
    _watchers[1].EventArrived += new EventArrivedEventHandler(Watcher_EventArrived);
    _watchers[1].Start();
}

private void Watcher_EventArrived(object sender, EventArrivedEventArgs e)
{
    ManagementBaseObject process = (ManagementBaseObject)e.NewEvent["TargetInstance"];
    String executablePath = process["ExecutablePath"].ToString();
    ApplicationInfo app = _monitoredApps.SingleOrDefault(app => app.Key.ToLower() == executablePath.ToLower()).Value;

    switch (e.newEvent.ClassPath.ClassName)
    {
        case "__InstanceCreationEvent": // process has started/been opened
        {
            // UI updates to show process id, session id and status
            break;
        }

        case "__InstanceDeletionEvent": // process has been terminated
        {
            Restart(app);
            break;
        }
    }
}

private void Restart(ApplicationInfo appInfo)
{
    // UI updates
    // Checks that the app isn't already running e.g. started by user before timer elapsed

    Process process = new Process();
    process.StartInfo.WorkingDirectory = appInfo.ExecutablePath;
    process.StartInfo.FileName = appInfo.ProgramName;
    process.Start(); // Elevated privileges not required
}    

У меня есть два конкретных вопроса:

  1. Системные классы, которые сообщают о внутренних событиях (или системные классы в целом), сообщают о событиях только тогда, когда они подписаны (например, с помощью ManagementEventWatcher)?
  2. Если нет, то как и когда потребляются внутренние события, поскольку они не сохраняются между опросами?

0 ответов

Другие вопросы по тегам