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 中的所有内部事件(如 __InstanceCreationEvent)都利用轮询来检测更改 - 总是有可能错过特别短的事件。通过减少轮询间隔,您肯定会提高检测率,但绝对无法保证。
另请记住,WMI 轮询查询会消耗大量 CPU 资源,您不会提及您的环境,但一般来说,您要监视的打印队列越多,您会看到的 CPU 利用率就越高。如果增加轮询速率,效果将被放大。这反过来可能导致更多错过的事件等。
如果你绝对需要准确性,你可以查看 FindFirstPrinterChangeNotification 和 FindNextPrinterChangeNotification Win32 API 函数,但它的实现比 WMI 解决方案要复杂一些。代码项目中有一些关于如何在 .NET/C# 中工作的指南。