C中的ManagementEventWatcher丢失事件#
问题描述:
我正在开发一个应用程序,它使用ManagementEventWatcher
来监视USB
事件。代码正常工作,但在某些情况下程序丢失了一些USB events
。从USB列出所有事件的正确方法是什么?C中的ManagementEventWatcher丢失事件#
我正在使用下面的代码,我使用两个查询监视器附加和从USB分离。我需要监视很多USB端口。
USB显示器
ManagementEventWatcher watchUSBattach = new ManagementEventWatcher();
ManagementEventWatcher watchUSBDettach = new ManagementEventWatcher();
WqlEventQuery queryUsbAttach = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2 ");
watchUSBattach.EventArrived += new EventArrivedEventHandler(watchUSBEventAdd);
watchUSBattach.Query = queryUsbAttach;
watchUSBattach.Start();
WqlEventQuery queryUsbDettach = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 3");
watchUSBDettach.EventArrived += new EventArrivedEventHandler(watchUSBEventDettach);
watchUSBDettach.Query = queryUsbDettach;
watchUSBDettach.Start();
答
为USB设备插入或拔出时,监视我曾经历过类似的事情。下面的示例代码。如果WithinInterval
属性设置为1ms,那么我不会错过这些事件,而是在WMIProviderHost和相关服务中遇到不合理的CPU负载。如果我将它设置为一个更合理的值,例如3秒,那么我错过了删除/创建事件(如果它们来自同一设备的速度太快)(例如设备自行复位)。也许在您的查询中,默认WithinInterval
太长,导致事件被删除?
WqlEventQuery q;
var scope = new ManagementScope("root\\CIMV2")
{Options = {EnablePrivileges = true}};
q = new WqlEventQuery
{
EventClassName = "__InstanceCreationEvent",
WithinInterval = TimeSpan.FromMilliseconds(1),
Condition = @"TargetInstance ISA 'Win32_USBControllerdevice'"
};
InsertWatcher = new ManagementEventWatcher(scope, q);
InsertWatcher.EventArrived += (sender, args) =>
{
var instance = (ManagementBaseObject) args.NewEvent["TargetInstance"];
RaiseInserted(new PlugEventArgs {DevicePath = (string) instance["__PATH"]});
};
InsertWatcher.Start();