2016-10-31 3 views
0

Я разрабатываю приложение, которое использует ManagementEventWatcher для мониторинга событий USB. Код работает правильно, но в некоторых случаях программа потеряла USB events. Каков правильный способ перечислить все события с USB?ManagementEventWatcher проигрывает события в C#

Я использую следующий код, я использую два запроса для подключения монитора и отсоединения от usb. Мне нужно контролировать множество USB-портов.

USB Monitor

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

ответ

0

я испытал нечто подобное при мониторинге для вставки USB-устройства или удаления. Пример кода ниже. Если для свойства WithinInterval установлено значение 1 мс, то я не пропускаю события, но вместо этого я испытываю необоснованную загрузку процессора в WMIProviderHost и связанной с ним службе. Если я установил его более разумное значение, например, 3 секунды, то я пропущу события Deletion/Creation, если они происходят вместе с одним и тем же устройством слишком быстро (например, если устройство сбрасывается). Возможно, с вашим запросом значение по умолчанию 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(); 
Смежные вопросы