Sorry about the delayed response to your question.
We have a dialog that continuously performs discovery for Bluetooth devices through a radio. When discovery completes, the list is filtered for the class of device we are looking for. Each device is then checked to determine if it is in range to prevent 'ghosting' of devices no longer detected. After all of this is completed, the discovery process is repeated until the dialog is closed.
This all occurs in a background thread. I noticed when the discovery process completes (wclnet.wclBluetoothDiscovery.DiscoveryComplete) it happens on the main UI thread, so I save the list of detected devices and then a background thread receives the list and processes them. The actual call to InRange occurs in this background thread.
I have observed the UI freezing on regular intervals, and it appears to be during the background threads operation. If I break execution during the freezing, the process is always stopped at InRange and I have verified it is being called on a background thread, not the UI thread.