private void PairLoop(CancellationToken token)
        {
            // Get a copy of known addresses since
            // these are added to in another task.
            BluetoothAddress[] addresses = FindDevices(token);

            /*lock (knownAddresses)
             *      addresses = KnownAddresses.ToArray();*/

            bool        available        = false;
            bool        connectedChanged = false;
            List <long> newConnected     = new List <long>();

            foreach (BluetoothAddress address in addresses)
            {
                if (token.IsCancellationRequested)
                {
                    return;
                }
                BluetoothDeviceInfo device = new BluetoothDeviceInfo(address);

                bool isDiscoverable = device.IsDiscoverable();
                bool installed      = device.InstalledServices.Any();

                if (device.Connected)                  // || isDiscoverable)) {
                {
                    if (!connected.Contains(address.ToInt64()))
                    {
                        connectedChanged = true;
                    }
                    newConnected.Add(address.ToInt64());
                    if (!available && !IsAnyDeviceAvailable)
                    {
                        lock (knownAddresses)
                            IsAnyDeviceAvailable = true;
                    }
                    available = true;
                    continue;
                }
                else if (isDiscoverable && !device.Connected /*device.IsDiscoverable()*/)
                {
                    if (device.Remembered)
                    {
                        RemoveDevice(device, token);
                    }
                    if (PairDevice(device, token, available))
                    {
                        if (!connected.Contains(address.ToInt64()))
                        {
                            connectedChanged = true;
                        }
                        newConnected.Add(address.ToInt64());
                        if (!available && !IsAnyDeviceAvailable)
                        {
                            Trace.WriteLine("First device has been connected");
                            lock (knownAddresses)
                                IsAnyDeviceAvailable = true;
                        }
                        available = true;
                    }
                }
            }
            if (connectedChanged)
            {
                lock (connected) {
                    connected.Clear();
                    foreach (long addr in newConnected)
                    {
                        connected.Add(addr);
                    }
                }
            }
            if (!available && IsAnyDeviceAvailable)
            {
                Trace.WriteLine("No more devices connected");
                lock (knownAddresses)
                    IsAnyDeviceAvailable = false;
            }
        }