Из того, что я видел, это нормально.Здесь я сталкиваюсь с точно такой же проблемой.
Две вещи, которые вы можете сделать - установить переменную для DateTime.Now, а затем проверить следующее прибытие, чтобы увидеть, меньше ли разница во времени между прибывающими, чем x секунд отв последний раз было событие (в основном сохраняйте время с момента последней обработки поступления)
или
Вы можете сохранить список дисков, и если событие обрабатывает то же устройство, что и выесть, тогда вы игнорируете это.
Но да, поскольку USB-устройства часто представляются системе как несколько устройств, она имеет тенденцию отправлять несколько вставок устройств.
Еще одна вещь, к которой я привыкОбойти это можно с помощью событий WMI, с помощью наблюдателя для обнаружения событий логического хранения (__InstanceCreation с целью Win32_LogicalDisk)
private void startMonitor()
{
while (serviceStarted)
{
ManagementEventWatcher watcher = new ManagementEventWatcher();
WqlEventQuery query = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_LogicalDisk'");
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
watcher.Query = query;
watcher.Start();
watcher.WaitForNextEvent();
}
Thread.CurrentThread.Abort();
}
С обработчиком EventArrived ...
private void watcher_EventArrived(object obj, EventArrivedEventArgs e)
{
var newEvent = e.NewEvent;
ManagementBaseObject targetInstance = (ManagementBaseObject)newEvent.GetPropertyValue("TargetInstance");
string drivename = targetInstance.GetPropertyValue("Name").ToString();
Drivename заканчивается буквой диска, такой как D: или что-то еще ...
Недостатком является то, что приложение должно работать с корректнойt привилегий для локальной области WMI, и это немного более интенсивно, чем пассивная обработка оконных сообщений.