2016-10-31 1 views
0

이벤트를 모니터링하기 위해 ManagementEventWatcher을 사용하는 응용 프로그램을 개발 중입니다. 코드는 제대로 작동하지만 어떤 경우에는 프로그램이 일부 USB events을 잃어 버렸습니다. USB의 모든 이벤트를 나열하는 올바른 방법은 무엇입니까?ManagementEventWatcher가 C#에서 이벤트를 잃음

다음 코드를 사용 중이며 모니터 연결과 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

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(); 
관련 문제