0

I have two functions. One is for query in WMI for USB devices, and 2nd one is for detect device remove/insertion. Both of them work independently very well. The problem starts when I trying to make the function responsible for detecting devices trigger function responsible for listing devices. Refresh the list when I connect or remove devices. It shows that the application is in "break mode" because of the threads. I know that I will have to take for example the device detection function and put it to different thread and send for example integer 0/1 when devices are inserted/removed so that will trigger the list function in the GUI thread. The problem is that I have no idea how to do it ;/.

Device list code:

private void button1_Click(object sender, EventArgs e)
    {
        listView1.Items.Clear();

        ManagementObjectSearcher s =
        new ManagementObjectSearcher("root\\CIMV2", @"SELECT * FROM Win32_PnPEntity where DeviceID Like ""USB%""");
        try
        {
            foreach (ManagementObject device in s.Get())
            {

                string Name = device.GetPropertyValue("Name").ToString();
                    ListViewItem items = new ListViewItem(Name);
                string Description = device.GetPropertyValue("Description").ToString();
                    items.SubItems.Add(Description);
                string Caption = device.GetPropertyValue("Caption").ToString();
                    items.SubItems.Add(Caption);
                string PNPDeviceID = device.GetPropertyValue("PNPDeviceID").ToString();
                    items.SubItems.Add(PNPDeviceID);
                string DeviceID = device.GetPropertyValue("DeviceID").ToString();
                    items.SubItems.Add(DeviceID);
                string Service = device.GetPropertyValue("Service").ToString();
                    items.SubItems.Add(Service);
                string Status = device.GetPropertyValue("Status").ToString();
                    items.SubItems.Add(Status);
                string Manufacturer = device.GetPropertyValue("Manufacturer").ToString();
                    items.SubItems.Add(Manufacturer);
                Boolean zmienna6 = (Boolean)device.GetPropertyValue("ConfigManagerUserConfig");
                string ConfigManagerUserConfig = zmienna6.ToString();
                    items.SubItems.Add(ConfigManagerUserConfig);
                /// string zmienna7 = (String)device.GetPropertyValue("ProtocolCode");
                listView1.Items.Add(items);


            }
        }
        catch (ManagementException ex)
        {
            MessageBox.Show("An error occurred while querying for WMI data: " + ex.Message);
           
        }

Function for detecting devices:

private void Form1_Load(object sender, EventArgs e)
    {
        bgwDriveDetector.DoWork += bgwDriveDetector_DoWork;
        bgwDriveDetector.RunWorkerAsync();
    }

    
    /// detection of the device con or discon
    private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
    {
        /// send intiger or string 1
    }

    private void DeviceRemovedEvent(object sender, EventArrivedEventArgs e)
    {
        /// send intiger or string 0
    }

    void bgwDriveDetector_DoWork(object sender, DoWorkEventArgs e)
    {
        var insertQuery = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");
        var insertWatcher = new ManagementEventWatcher(insertQuery);
        insertWatcher.EventArrived += DeviceInsertedEvent;
        insertWatcher.Start();

        var removeQuery = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 3");
        var removeWatcher = new ManagementEventWatcher(removeQuery);
        removeWatcher.EventArrived += DeviceRemovedEvent;
        removeWatcher.Start();
    }
  • The following post may be helpful: https://stackoverflow.com/questions/65957066/serial-to-usb-cable-from-a-scale-to-pc-some-values-are-just-question-marks/65971845#65971845 – Tu deschizi eu inchid Apr 05 '21 at 17:53
  • You don't need a BackgroundWorker and you can simply BeginInvoke() a delegate to marshal to the UI Thread. See here: [How do I get information about recently connected USB device?](https://stackoverflow.com/a/54298316/7444103). Also here, in case you need it: [Get the serial number of USB storage devices in .Net Core 2.1](https://stackoverflow.com/a/51806262/7444103) (not just the *serial number*, as you can see :) – Jimi Apr 05 '21 at 18:04
  • Jimi you are the best :) – ProgramistaZaDyche Apr 05 '21 at 20:14

0 Answers0