2014-11-24 2 views
0

Я использую 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, когда моя программа закрывается?

Любая помощь?

+0

Это может помогите проверить еще два события на каждом из объектов ManagementEventWatcher: Stopped and Disposed. Вызывается ли это когда-нибудь? – Alexandru

+0

@Alexandru Что значит? Как должен выглядеть запрос? – Eli

+0

Вы включили события EventArrived в свой код. Сделайте то же самое для событий Stopped and Disposed и посмотрите, вызваны ли они в какой-то момент. – Alexandru

ответ

0

Попробуйте это:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Management; 
using System.Text; 
using System.Threading.Tasks; 

namespace EventWatcher 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      StartMonitoringProcessCreation(); 
      StartMonitoringProcessTermination(); 
      Console.ReadLine(); 
     } 

     private static void StartMonitoringProcessCreation() 
     { 
      ManagementEventWatcher startWatcher = new ManagementEventWatcher("SELECT * FROM Win32_ProcessStartTrace"); 
      startWatcher.EventArrived += new EventArrivedEventHandler(startWatcher_EventArrived); 
      startWatcher.Stopped += new StoppedEventHandler(startWatcher_Stopped); 
      startWatcher.Disposed += new EventHandler(startWatcher_Disposed); 
      startWatcher.Start(); 
     } 

     private static void StartMonitoringProcessTermination() 
     { 
      ManagementEventWatcher stopWatcher = new ManagementEventWatcher("SELECT * FROM Win32_ProcessStopTrace"); 
      stopWatcher.EventArrived += new EventArrivedEventHandler(stopWatcher_EventArrived); 
      stopWatcher.Stopped += new StoppedEventHandler(stopWatcher_Stopped); 
      stopWatcher.Disposed += new EventHandler(stopWatcher_Disposed); 
      stopWatcher.Start(); 
     } 

     static void startWatcher_EventArrived(object sender, EventArrivedEventArgs e) 
     { 
      Console.WriteLine("Got creation event."); 
     } 

     static void startWatcher_Stopped(object sender, StoppedEventArgs e) 
     { 
      Console.WriteLine("The startWatcher has stopped. Disposing it."); 
      ((ManagementEventWatcher)sender).Dispose(); 
     } 

     static void startWatcher_Disposed(object sender, EventArgs e) 
     { 
      Console.WriteLine("The startWatcher has been disposed. Restarting it."); 
      StartMonitoringProcessCreation(); 
     } 

     static void stopWatcher_EventArrived(object sender, EventArrivedEventArgs e) 
     { 
      Console.WriteLine("Got termination event."); 
     } 

     static void stopWatcher_Stopped(object sender, StoppedEventArgs e) 
     { 
      Console.WriteLine("The stopWatcher has stopped. Disposing it."); 
      ((ManagementEventWatcher)sender).Dispose(); 
     } 

     static void stopWatcher_Disposed(object sender, EventArgs e) 
     { 
      Console.WriteLine("The stopWatcher has been disposed. Restarting it."); 
      StartMonitoringProcessTermination(); 
     } 
    } 
} 

Edit: Из-за того, что вы сказали мне, это может быть просто проще для вас, чтобы сделать что-то вроде этого ...

new Thread(() => 
{ 
    while (true) 
    { 
     Process[] list = Process.GetProcessesByName("yourProcessName"); 
     if (list.Length == 0) 
      Console.WriteLine("Not running."); 
     else 
      Console.WriteLine("Running."); 
     Thread.Sleep(1000); 
    } 
}).Start() 
+0

Привет, Александру, извините за задержку выходных дней :) Я проверю ваш ответ, большое спасибо! – Eli

+0

Привет, я пробовал это, к сожалению, он начинает эскалироваться в ближайшее время, когда я его реализую - его вводят в бесконечный цикл. Но я попробовал что-то еще, просто назовите отправителя '((ManagementEventWatcher)) .Start();' вместо того, чтобы удалять при остановленном событии. На самом деле я все еще не уверен, что все в порядке, мне нужно больше тестирования на нем. – Eli

+0

@Eli Это звучит странно. Код работает на моей машине, но кажется, что Stop всегда вызывает вас. Например, на данный момент вы начинаете его, кажется, что он останавливается мгновенно. Попробуйте поставить точку останова на остановку и посмотреть, как скоро она появится. – Alexandru

Смежные вопросы