Приложение 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);
}
});
}
}