【问题标题】:Wmi EventWatcher missing events - fix?Wmi EventWatcher 缺少事件 - 修复?
【发布时间】:2025-12-03 00:10:01
【问题描述】:

我正在尝试监视我们的服务器,并且需要捕获 __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 秒计时器用完之前完成的,这可能吗?

但是。有没有办法接收 100% 的所有 PrintJob 创作?

或者使用其他机制比 WMI-watcher 更好?

更新

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

【问题讨论】:

    标签: c# printing wmi


    【解决方案1】:

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

    另外请记住,WMI 轮询查询会消耗大量 CPU 资源,您不会提及您的环境,但通常情况下,您要监控的打印队列越多,您会看到更多的 CPU 利用率。如果提高轮询率,效果将被放大。这反过来可能导致更多错过的事件等。

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

    【讨论】:

    • 我知道 Win32 api。通常我是 C++ 开发人员,我正在尝试用 C# 重写我的程序以用于学习目的
    最近更新 更多