IscancellationRected, требуя много времени для обновления после Cancel ()C#

Место общения программистов C#
Ответить
Anonymous
 IscancellationRected, требуя много времени для обновления после Cancel ()

Сообщение Anonymous »

Я замечаю какое -то странное поведение с помощью отмены. P> Я не уверен, является ли это причиной, но в случае, если она актуальна, она используется в отношении BluetoothLeadSementWatcher .
Вот некоторые из соответствующих фрагментов Иллюстрируйте, как это используется (вся структура кода была бы слишком сложной).
, так что возьмите следующий класс, AdvertisementHandler :

Код: Выделить всё

    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>
Затем в отдельном классе у меня есть что -то вроде ... < /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.
}
Во -первых, DetectNewDevices () получает вызывается, который вызывает startWatching () и передает ему токен отмены. Это заставляет рекламные объявления начать течь (

Код: Выделить всё

Received
Событие пожара в каждой рекламе.) /code> (я вижу его в журнале). Тем не менее, это может занять немного времени, в одном случае почти 2 минуты, прежде чем оно признает _cancellationtoken.iscancellationrected как правда.
Обратите внимание, что это не просто потому, что Потребовалось задолго до того, как этот обработчик событий был назван в следующий раз - я получил много рекламных объявлений в то же время (то есть «Полученная реклама» появляется в журнале) и даже поместил там точку останова и увидел, что IscancellationRequested является ложным Полем В конце концов это изменяется на True, но почему бы не мгновенно после вызова cancel () ? это просто причуда этой структуры.

Подробнее здесь: https://stackoverflow.com/questions/794 ... ter-cancel
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»