我正在使用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 回答
试试这个:
Edit :因为你告诉我的事情,你可能更容易做这样的事......