Warum funktioniert der Aufgabenabbruch in meinem Code nicht?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Warum funktioniert der Aufgabenabbruch in meinem Code nicht?

Post by Anonymous »

Ich habe einen Code, der nach der Eingabe durch den Benutzer QR-Code in MainThread erstellt. Um die Generierung nach jeder kleinen Änderung zu verhindern, habe ich versucht, mit Task.Delay und CancellationToken eine Art Timer zu erstellen, der jedes Mal abgebrochen werden kann, wenn das TextChanged-Ereignis auftritt. Aber aus irgendeinem Grund erreicht der Code mit TaskCanceledException und OperationCanceledException nie den Abschnitt „catch“. Ich fange an zu überlegen, ob es ein Problem gibt, weil das Abbrechen und eine Codeaktualisierungslogik in MainThread ausgeführt werden und sie sich gegenseitig blockieren, oder ist es etwas anderes?
Warum funktioniert das Abbrechen von Aufgaben nicht und die Meldung ABGEBROCHEN wird nie angezeigt?

Hier ist mein Code:

Code: Select all

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));
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post