2015-07-07 2 views
0

Я впервые использую BackGroundWorker и EventHandler. Я не знаю, правильно ли я делаю это или нет. Я хочу искать подключенные USB-устройства (только у которых есть определенный VID & PID). Потому что отладка программы не хочет идти внутри цикла bw_worker_dowork.C# backgroundworker & eventhandler вместе - поиск устройств USB

Я также использую WPF с методом MVVM - для информации.

Прошу помощи. Я делаю это правильно или нет?

BackgroundWorker bw_worker; 
    USBmiddleware cs = new USBmiddleware(); 


    public Windows1ViewModel() 
    { 
     bw_worker = new BackgroundWorker(); 
     bw_worker.DoWork += new DoWorkEventHandler(bw_worker_dowork); 
     bw_worker.WorkerReportsProgress = true; 
     bw_worker.WorkerReportsProgress = true; 


    } 

    void bw_worker_dowork(object sender, DoWorkEventArgs e) 
    { 
     WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'"); 

     ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery); 
     insertWatcher.EventArrived += new EventArrivedEventHandler(DeviceInsertedEvent); 
     insertWatcher.Start(); 

     WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'"); 
     ManagementEventWatcher removeWatcher = new ManagementEventWatcher(removeQuery); 
     removeWatcher.EventArrived += new EventArrivedEventHandler(DeviceRemovedEvent); 
     removeWatcher.Start(); 

     // Do something while waiting for events 
     System.Threading.Thread.Sleep(20000000); 
    } 

    void DeviceInsertedEvent(object sender, EventArrivedEventArgs e) 
    { 
     cs.FindDevices(); 
    } 

    void DeviceRemovedEvent(object sender, EventArrivedEventArgs e) 
    { 
     cs.FindDevices(); 
    }  
+0

Я просто хочу, чтобы Windows открывала и искала USB-устройства в фоновом режиме :) – Pukaai

+0

Вам не нужно «BackgroundWorker» вообще, если объекты 'insertWatcher' и' removeWatcher' остаются в области. Переместите содержимое метода 'bw_worker_dowork' (кроме' Sleep') в конструктор, и оно должно работать. –

+0

Я тестирую также версию без BackgroundWorker, но потом у меня проблема, что ничего не случилось, когда я подключаю устройство или отключает его. – Pukaai

ответ

0

Вы не запустили свой BackgroundWorker! BackgroundWorker.RunWorkerAsync Method

+0

Спасибо! Но теперь, когда я отсоединяю устройство и подключаю его обратно, ничего не происходит :) – Pukaai

+0

Это не EventWatcher EventWatcher? :) Когда что-то происходит, реакция происходит? Или я ошибаюсь (потому что я довольно свежий на C#)? – Pukaai

+0

Или я делаю что-то неправильно, потому что я определил EventWatcher в ViewModel MVVM? Или как это правильно? – Pukaai

0

Извините. Проблема была там:

До:

"SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'" 

Сейчас:

"SELECT * FROM Win32_DeviceChangeEvent WHERE  EventType = 2" 

Перед работал только на моем USB-гарнитура, теперь работает и для моего другого устройства :) К сожалению.

Смежные вопросы