WMI 事件观察器缺少事件 - 修复

本文关键字:事件 修复 观察 WMI | 更新日期: 2023-09-27 18:35:44

我正在尝试监视我们的服务器,并且需要捕获__InstanceCreationEvent以便在创建Win32_PrintJob时获得通知。为此,我尝试使用几乎效果良好的ManagementEventWatcher,但观察者错过了一些 PrintJob 创建。

ManagementEventWatcher watcher = 
                    new ManagementEventWatcher(Server.Name + @"'root'cimv2",
                    "Select * From __InstanceCreationEvent Within 1 
                    Where TargetInstance ISA 'Win32_PrintJob'");
watcher.EventArrived += PrintJobCreated;
watcher.Start();

每当创建一个非常短/很小的 PrintJob 时,例如测试页面,我不会一直得到创建事件。我不知道,但我想这是因为 PrintJob 是在 1 秒计时器用完之前完成的,这可能吗?

然而。有没有办法获得所有PrintJob创作的100%

还是使用另一种机制比 WMI 观察程序更好?

更新

我试图将within更改为0.1效果更好,但是 100 毫秒在这里有意义吗?

WMI 事件观察器缺少事件 - 修复

WMI 中的所有内部事件(如 __InstanceCreationEvent)都利用轮询来检测更改 - 总是有可能错过特别短的事件。通过减少轮询间隔,您肯定会提高检测率,但绝对无法保证。

另请记住,WMI 轮询查询会消耗大量 CPU 资源,您不会提及您的环境,但一般来说,您要监视的打印队列越多,您会看到的 CPU 利用率就越高。如果增加轮询速率,效果将被放大。这反过来可能导致更多错过的事件等。

如果你绝对需要准确性,你可以查看 FindFirstPrinterChangeNotification 和 FindNextPrinterChangeNotification Win32 API 函数,但它的实现比 WMI 解决方案要复杂一些。代码项目中有一些关于如何在 .NET/C# 中工作的指南。