Я использую WMI для контроля запуска и остановки процессов на машине Win XPC#: WMI остановить стрельбы события
Мой код выглядит следующим образом:
ManagementEventWatcher m_Create;
ManagementEventWatcher m_Delete;
private void SetMonitors()
{
string queryStartTrace = "SELECT * FROM Win32_ProcessStartTrace";
string queryStopTrace = "SELECT * FROM Win32_ProcessStopTrace";
m_Create = new ManagementEventWatcher(queryStartTrace);
m_Delete = new ManagementEventWatcher(queryStopTrace);
m_Create.EventArrived += new EventArrivedEventHandler(this.OnCreationArrived_Event);
m_Delete.EventArrived += new EventArrivedEventHandler(this.OnDeletionArrived_Event);
}
private void OnCreationArrived_Event(object sender, EventArrivedEventArgs e){...}
private void OnDeletionArrived_Event(object sender, EventArrivedEventArgs e){...}
Все работает отлично. Но внезапно перестает работать, не знаю почему. Только после перезагрузки мой компьютер возвращается на работу.
Edit 1 Как @Alexandru помог мне, я назначил наблюдатель на остановленные и выбывшие события:
m_Create.Stopped += new StoppedEventHandler(watcherCreate_Stopped);
m_Create.Disposed += new EventHandler(watcherCreate_Disposed);
m_Delete.Stopped += new StoppedEventHandler(watcherDelete_Stopped);
m_Delete.Disposed += new EventHandler(watcherDelete_Disposed);
И добавил эти методы:
void watcherCreate_Stopped(object sender, StoppedEventArgs e)
{
if (m_activeWatchers)
m_watcherCreate.Start();
}
void watcherCreate_Disposed(object sender, EventArgs e)
{
if (m_activeWatchers)
m_watcherCreate.Start();
}
void watcherDelete_Disposed(object sender, EventArgs e)
{
if (m_activeWatchers)
m_watcherDelete.Start();
}
void watcherDelete_Stopped(object sender, StoppedEventArgs e)
{
if (m_activeWatchers)
m_watcherDelete.Start();
}
Теперь я имею дело с интересная проблема, остановленное событие ->, а затем есть вызовы m_Create.Start()
, m_Delete.Start()
, а затем прекращено событие ->и так далее на до полной квоты ...
Edit 2 Найдено эту ссылку ManagementEventWatcher stops raising EventArrived. без полезного ответа, но с некоторой подсказкой Должен ли я отменить регистрацию событий WMI, когда моя программа закрывается?
Любая помощь?
Это может помогите проверить еще два события на каждом из объектов ManagementEventWatcher: Stopped and Disposed. Вызывается ли это когда-нибудь? – Alexandru
@Alexandru Что значит? Как должен выглядеть запрос? – Eli
Вы включили события EventArrived в свой код. Сделайте то же самое для событий Stopped and Disposed и посмотрите, вызваны ли они в какой-то момент. – Alexandru