Почему в моем коде не работает отмена задачи?C#

Место общения программистов C#
Ответить
Anonymous
 Почему в моем коде не работает отмена задачи?

Сообщение Anonymous »

У меня есть код, который создает qr-код в MainThread после ввода пользователем. Чтобы предотвратить генерацию после каждого небольшого изменения, я попытался создать своего рода таймер с Task.Delay и CancellationToken, который можно было бы отменить каждый раз, когда произойдет событие TextChanged. Но по какой-то причине код никогда не достигает раздела catch с TaskCanceledException и OperationCanceledException. Я начинаю думать, не является ли проблема причиной отмены и какой-то логики обновления кода, работающей в MainThread, и они блокируют друг друга, или это что-то еще?
Почему отмена задачи не работает, а сообщение CANCELED никогда не появляется?
Вот мой код:
private const int DebounceDelayMs = 1000;
private CancellationTokenSource? cancellationSource;
[RelayCommand] private async Task OnTextChanged()
{
if (cancellationSource != null)
{
cancellationSource.Cancel();
Debug.WriteLine("CANCEL REQUESTED");
}
cancellationSource = new();
await DebounceGenerateQrCodeAsync(Code, cancellationSource.Token);
}
private async Task DebounceGenerateQrCodeAsync(string? text, CancellationToken cancellationToken)
{
try
{
Debug.WriteLine("UPDATE REQUESTED");
await Task.Delay(DebounceDelayMs, cancellationToken);
cancellationToken.ThrowIfCancellationRequested();
await GenerateQrCodeAsync(text, cancellationToken);
}
catch (OperationCanceledException)
{
Debug.WriteLine("CANCELED");
}
catch (Exception ex)
{
// Handle errors
}
}
private async Task GenerateQrCodeAsync(string? code, CancellationToken cancellationToken)
{
if (string.IsNullOrWhiteSpace(code))
{
QrCodePreview = null;
OnPropertyChanged(nameof(QrCodePreview));
return;
}

byte[] pixels = await Task.Run(() =>
{
// Generate QR code on background thread
using var qrGenerator = new QRCodeGenerator();
using var qrCodeData = qrGenerator.CreateQrCode(code, QRCodeGenerator.ECCLevel.Q);
using var qrCode = new PngByteQRCode(qrCodeData);
return qrCode.GetGraphic(20);
}, cancellationToken);

cancellationToken.ThrowIfCancellationRequested();

// some logic for main thread

using var stream = new MemoryStream(pixels);
using var randomAccessStream = stream.AsRandomAccessStream();
randomAccessStream.Seek(0);
cancellationToken.ThrowIfCancellationRequested();

var writeableBitmap = new WriteableBitmap(QrCodeWidth, QrCodeHeight);
await writeableBitmap.SetSourceAsync(randomAccessStream);
writeableBitmap.Invalidate();
cancellationToken.ThrowIfCancellationRequested();

Debug.WriteLine("UPDATE");
QrCodePreview = writeableBitmap;
OnPropertyChanged(nameof(QrCodePreview));
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... in-my-code
Ответить

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

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

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

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

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