我的代码导致WMI提供程序主机(WmiPrvSE.exe)

时间:2017-04-05 11:44:42

标签: c# wmi-query wmi-service

我在C#中构建了一个项目,在某些时候它必须监听另一个文件的打开和关闭。我使用的代码实际上工作,但不知何故,每次我运行我的项目“WMI提供者主机”将疯狂的CPU使用率。首次运行它将达到50%的使用率,每次我重新开始我的项目它将上升10%,直到它达到100%。我不确定我的代码是否出错了。

我尝试将该函数放入一个新的干净文件中,但却找不到相同的结果。

这就是它的样子:

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 =
        $@"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();
            }
        }

    }
}

我不确定为什么这会因为它的CPU占用率而烦恼WMI。

仅添加了参考文献“系统管理”。

这里有任何人有任何建议或知道为什么会这样吗?谢谢!

1 个答案:

答案 0 :(得分: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();