首页 文章

c#:WMI停止触发事件

提问于
浏览
0

我正在使用WMI来监视Win XP机器上的启动和停止进程

我的代码是这样的:

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){...}

一切正常 . But 突然停止工作,不知道为什么 . 只有在重启我的机器后它才能恢复工作 .

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() 然后停止事件被解雇 - > and so on 直到完全配额...

Edit 2 找到此链接ManagementEventWatcher stops raising EventArrived . 没有任何有用的答案,但有一些提示 - Should I unregister WMI events when my program closes?

有帮助吗?

1 回答

  • 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()
    

相关问题