Почему BluetoothLEAdvertisingWatcher прекращает запуск событий `Received`? - PullRequest
0 голосов
/ 05 февраля 2019

Приложение WPF, использующее BluetoothLEAdvertisingWatcher, в конечном итоге прекратит получать рекламные данные и, по-видимому, будет в плохом состоянии.

Windows 10 Pro 1809, сборка 17763.292.WPF-приложение, использующее Win 10 native apis через этот файл winmd: C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.17763.0\Windows.winmd

Требуется от 1 до 7 часов, чтобы вызвать плохое состояние, но это всегда происходит в конечном итоге.

После входа вВ плохом состоянии процесс «Система» показывает высокую загрузку ЦП.

Обнаружено что-то, что, по-видимому, описывает то же поведение, но на малиновом пи: https://github.com/MicrosoftDocs/windows-uwp/issues/812

Воспроизводится с этим репо: https://github.com/jeremywho/win10testingAdWatcher

Вот код, используемый вокруг BluetoothLEAdvertisementWatcher:

public class MainWindowViewModel : BaseViewModel
{
    public ObservableCollection<DeviceViewModel> Devices { get; } = new ObservableCollection<DeviceViewModel>();
    private readonly BluetoothLEAdvertisementWatcher _watcher;
    private object _locker = new object();

    public MainWindowViewModel()
    {
        _watcher = new BluetoothLEAdvertisementWatcher {ScanningMode = BluetoothLEScanningMode.Active};
        _watcher.Received += OnAdvertisementReceived;
        _watcher.Stopped += OnAdvertisementWatcherStopped;

        _watcher.Start();
    }

    private void OnAdvertisementWatcherStopped(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementWatcherStoppedEventArgs args)
    {
        Debug.WriteLine($"{DateTime.Now} [{sender.Status}] [{sender.GetHashCode()}] stopped called");
    }

    private void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
    {
        if (string.IsNullOrEmpty(eventArgs.Advertisement.LocalName)) return;

        var timestamp = eventArgs.Timestamp;
        var advertisementType = eventArgs.AdvertisementType;
        var rssi = eventArgs.RawSignalStrengthInDBm;
        var localName = eventArgs.Advertisement.LocalName;

        Debug.WriteLine($"[{DateTime.Now}] [{timestamp}] [{localName}] [{rssi}] [{advertisementType}]");

        lock(_locker)
        {
            var foundDevice = Devices.FirstOrDefault(d => d.BluetoothAddress == eventArgs.BluetoothAddress.ToString());
            if (foundDevice != null)
            {
                foundDevice.LastSeen = timestamp.ToString();
                return;
            }
        }

        Application.Current.Dispatcher.Invoke(() =>
        {
            lock (_locker)
            {
                var device = new DeviceViewModel(eventArgs.Advertisement.LocalName, eventArgs.BluetoothAddress, timestamp);
                Devices.Add(device);
            }
        });
    }
}

1 Ответ

0 голосов
/ 18 апреля 2019

Кажется, это известная ошибка в Windows 10 (возможно, 1809 и раньше), которая может произойти, если вы запустите «активное сканирование».

Да, ваше приложение может вызвать такое поведение, если выРезультаты приложения в ОС делают "активное сканирование".Используете ли вы DeviceWatcher, и если да, то можете ли вы поделиться запросом, который использует приложение?

Мы также рассматриваем меры по смягчению с нашей стороны, у нас есть один в последней версии 19H1.Хотя активное сканирование не рекомендуется в течение продолжительного времени, если вы присоединяетесь к Windows Insiders и выбираете параметр, содержащий «активное развитие».

https://social.msdn.microsoft.com/Forums/en-US/274e5d96-d21d-490d-8c8b-934a41239f88/windows-100177631-microsoftbluetoothlegacyleenumeratorsys-stuck-in-its-deviced0entry-routine?forum=wdk

...