Wmi EventWatcher缺少事件 - 修复?

时间:2016-02-23 08:52:15

标签: c# printing wmi

我试图监控我们的服务器,并且需要抓住__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毫秒是否有意义?

1 个答案:

答案 0 :(得分:0)

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

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

如果您绝对需要准确性,可以查看FindFirstPrinterChangeNotificationFindNextPrinterChangeNotification Win32 API函数,但实现起来比WMI解决方案要复杂一些。在Code Project上有关于如何使其在.NET / C#中工作的一些指导。