我的代码导致 WMI 提供程序主机 (WmiPrvSE.exe) 中的 CPU 使用率很高



我用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。

唯一添加的参考是"系统管理"。

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

您不应该将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();

最新更新