2017-04-05 93 views
0

我在C#中建立了一个项目,它在某些时候需要监听其他文件的打开和关闭。我使用的代码实际上工作,但不知何故每次我运行我的项目“WMI提供者主机”将与CPU使用率疯狂。首先运行它会达到50%的使用率,每次我重新启动我的项目时,它会上升10%,直到达到100%。我不确定我的代码中是否有错误。我的代码在WMI Provider主机(WmiPrvSE.exe)中导致CPU使用率过高

我试图把这个函数放到一个新的干净的文件中,以找出相同的结果。

这是什么样子:

using System; 
using System.Threading; 
using System.Management; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      string startEventName = "InstanceCreationEvent"; 
      string stopEventName = "InstanceDeletionEvent"; 
      string processName = "notepad.exe"; 

      ListenForProcess(processName, startEventName, (sender, e) => 
      { 
       Console.WriteLine("Process Started"); 
      }); 

      ListenForProcess(processName, stopEventName, (sender, e) => 
      { 
       Console.WriteLine("Process Stopped"); 
      }); 

     } 

     static void ListenForProcess(string processName, 
     string eventName, EventArrivedEventHandler eventHandler) 
     { 

     string queryString = 
     [email protected]"SELECT TargetInstance 
     FROM __{eventName} 
     WITHIN 0.1 
     WHERE TargetInstance ISA 'Win32_Process' 
     AND TargetInstance.Name='{processName}'"; 

      using (var watcher = new ManagementEventWatcher(queryString)) 
      { 
       watcher.EventArrived += eventHandler; 
       watcher.Start(); 

       new Thread(() => 
       { 
        while (true) 
        { 
         watcher.WaitForNextEvent(); 
        } 
       }).Start(); 
      } 
     } 

    } 
} 

我不知道这是为什么它窃听WMI的CPU使用率。

只添加引用“系统管理”。

任何人在这里有任何建议或知道为什么会发生这种情况?谢谢!

回答

1

您不应该混合Start()WaitForNextEvent()。 Probalby Start()也将启动一个后台线程,等待相同的事件,因此混合这两种方法可能会导致奇怪的副作用。

因此,要么:

使用EventArrivedStart()(异步使用):

var watcher = new ManagementEventWatcher(queryString); 
watcher.EventArrived += eventHandler; 
watcher.Start(); 
... 
watcher.Stop(); 

或者,使用WaitForNextEvent(同步使用):

var watcher = new ManagementEventWatcher(queryString); 
var event = watcher.WaitForNextEvent(); 
... 
watcher.Stop(); 
+0

第一个代码你提供正是我使用的权利?我注意到的是,我不使用watcher.Stop。这可能是一个问题吗?我的项目应该继续倾听它(并且永不退出)。无论如何,我不知道如何整合你上面给我看的代码。 – user3299251

+0

您正在混合在一个程序中使用ManagementEventWatcher的同步和异步方式。请仔细阅读我的回答:) –