Hier einige der relevanten Snippets zu Veranschaulichen Sie, wie es verwendet wird (die gesamte Codestruktur wäre viel zu komplex).
Code: Select all
internal AdvertisementHandler(ILogger logger)
{
_logger = logger;
_adWatcher = new BluetoothLEAdvertisementWatcher();
_adWatcher.Received += OnAdvertisementReceived;
_adWatcher.Stopped += OnAdvertisementWatcherStopped;
}
internal void StartWatching(CancellationToken token)
{
_cancellationToken = token;
_adWatcher.Start();
}
internal void StopWatching()
{
_adWatcher.Stop();
}
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{
if (_cancellationToken.IsCancellationRequested)
{
_logger.LogDebug($"Cancelling device search");
StopWatching();
return;
}
_logger.LogDebug($"Received an advertisement");
// Properly handle the advertisement.
< /code>
Dann habe ich in einer separaten Klasse so etwas wie ... < /p>
private void DetectNewDevices()
{
try
{
_cancellationSource = new CancellationTokenSource(TimeSpan.FromSeconds(120));
_logger.LogDebug($"Looking for new {deviceName} devices");
_adHandler.StartWatching(_cancellationSource.Token);
Thread.Sleep(250);
}
catch (Exception ex)
{
_logger.LogException(ex);
}
}
public bool ChooseDevice(IDeviceInstance deviceInstance)
{
if (_cancellationSource != null)
{
_logger.LogDebug("Choosing A device so cancelling search.");
_cancellationSource.Cancel();
}
// Do some other stuff.
}
Code: Select all
Received
Dann, wenn ich später auf die Funktion von Choosesevice () drücke, geht es ein und ruft _cancellationsource.cancel (); < /Code> (Ich kann es im Protokoll sehen). Es kann jedoch einige Zeit dauern, in einem Fall fast 2 Minuten, bevor es _cancellationToken.iscancellationRequested als wahr ist. Es hat so lange gedauert, bis dieser Event -Handler als nächstes gerufen wurde - ich habe in der Zwischenzeit viele Anzeigen erhalten (d. H. "Eine Werbung erhalten" im Protokoll) und sogar einen Haltepunkt hineingelegt und gesehen, dass IscancellationRequested falsch ist . Schließlich ändert es sich zu True, aber warum nicht sofort nach dem Aufrufen von Cancel () ? ist nur eine Eigenart dieses Frameworks.