Scott Stewart

Scott Stewart

  • 1.6k
  • 189
  • 18.1k

Collection not populating except when stepping through the code.

Jun 10 2024 5:10 PM

MainWindowViewModel

public void MainWindowViewModel()
{
    
    var ports = LoadInstruments();
    if (ports.Count == 0)         //ports.Count = 0 when NOT stepping through.
    {
        //DoSomething
    }
    else
    {
        Instruments=ports;
    }
}

    Public ObservableCollection<Instrument> LoadInstuments()
    {
    InstComs inst=new();
    return inst.GetInstPortsAsync();   //Also tried awaiting this.
    }        


in InstComs Class

    public async Task<ObservableCollection<InstrumentViewModel>> GetInstrumentPortsAsync()
    {
       ObservableCollection<InstrumentViewModel> ports = new();
       foreach (string port in SerialPort.GetPortNames())
       {
           SerialPort sp = new()
           {
               PortName = port,
               ReadBufferSize = 1024,
               DiscardNull = true,
               RtsEnable = true,
               DtrEnable = true,
               ReceivedBytesThreshold = 1,
               BaudRate = 9600,
               StopBits = StopBits.One,
               Parity = Parity.None,
               DataBits = 8
           };

           try
           {
               sp.Open();
               if (sp.IsOpen)
               {
                   string instID = await Task.Run(()=> GetInstrumentId(sp));
                   if (instID != null)
                   {
                       if (instID.ToString().Contains("InstNo"))
                       {
                           InstrumentViewModel ivm = new();
                           ivm.Parity = sp.Parity;
                           ivm.StopBits = sp.StopBits;
                           ivm.InstID = instID.ToString().Split(',').ElementAt(2);
                           ivm.BaudRate = sp.BaudRate;
                           ivm.PortName = sp.PortName;
                           ivm.DataBits = 8;
                           ivm.RTSEnabled = sp.RtsEnable;
                           ivm.DTREnabled = sp.DtrEnable;
                           ivm.Port = sp;
                           ivm.IsConnected = true;
                           ports.Add(ivm);
                       }
                   }
               }
           }
           catch (InvalidOperationException)
           {
              //Handle it
           }
       }
       return ports;
   }

   Public Task<string> GetInstrumentID(string port)
   {
    try
    {
        string response = string.Empty;
        sp.WriteLine("*IDN?");
        while (sp.BytesToRead > 0)
        {
            respose += sp.ReadExisting();
        }
        return response.Replace("\r", "").Trim();
    }
    catch
    {
         //Do the catch stuff
    }
   }

When I step through the code, it works perfectly. The instrument is returned and appears in the list view in the main view with all of the data. If I just run it (in debug mode) the instruments collection remains empty. The MainWindowView has a ListView that is bound to the Instruments collection. 

Yes, a lot of code has been removed or left out. But none of it has a bearing on the way this behaves. I have tried awaiting GetInstrumentID. I have tried awaiting GetInstrumentPorts. None of it makes a difference. I have even tried a pause using Thread.Sleep(1000) to slow things down and that didn't help.

Any ideas?

 

Thanks,
 


Answers (2)