C中的ManagementEventWatcher丢失事件#

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();