我试图监控我们的服务器,并且需要抓住__InstanceCreationEvent
以便在创建Win32_PrintJob
时收到通知。为此,我尝试使用ManagementEventWatcher
,但效果差不多但是Watcher错过了一些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毫秒是否有意义?
答案 0 :(得分:0)
WMI中的所有内部事件(如__InstanceCreationEvent)都使用轮询来检测更改 - 总是有可能错过特别短的事件。通过减少轮询间隔,您肯定会提高检测率,但绝对没有保证。
另外请记住,WMI轮询查询会占用大量CPU资源,您没有提及您的环境,但一般来说,您要监视的打印队列越多,您将看到的CPU利用率就越高。如果增加轮询率,效果将被放大。这反过来可能导致更多错过事件等。
如果您绝对需要准确性,可以查看FindFirstPrinterChangeNotification和FindNextPrinterChangeNotification Win32 API函数,但实现起来比WMI解决方案要复杂一些。在Code Project上有关于如何使其在.NET / C#中工作的一些指导。