2016-10-31 11 views
0

イベントを監視するためにManagementEventWatcherを使用するアプリケーションを開発しています。コードは正常に動作しますが、プログラムによってはUSB eventsが失われることがあります。 USBからすべてのイベントをリストする正しい方法は何ですか?C#のイベントを失うManagementEventWatcher

私は次のコードを使用しています。私は、モニタの接続とUSBからの取り外しに2つのクエリを使用しています。私は多くの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(); 

答えて

0

を監視します。以下のコード例。 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(); 
関連する問題