IscancellationRequested dauert lange Zeit, um nach Canceling () zu aktualisieren ()C#

Ein Treffpunkt für C#-Programmierer
Guest
 IscancellationRequested dauert lange Zeit, um nach Canceling () zu aktualisieren ()

Post by Guest »

Ich bemerke ein seltsames Verhalten mit CancellationTokenSource wob p> Ich bin mir nicht sicher, ob dies die Ursache ist, aber für den Fall, dass es relevant ist, wird es in Bezug auf eine BluetootheLeadvertisementWatcher .
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.
}
ErkenntnisNewDevices () wird aufgerufen, wodurch StartWatching () an den Stornierungs -Token weitergeleitet wird. Dies führt dazu, dass die Anzeigen in der Fließung (

Code: Select all

Received
Ereignisfeuer auf jede Anzeige.)
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post