Brechen Sie den asynchronen Vorgang korrekt ab und starten Sie ihn erneut

Wie gehe ich mit Fällen um, in denen der Benutzer möglicherweise mehrmals auf die Schaltfläche drückt, wodurch eine lange asynchrone Ausführung aufgerufen wird?

Meine Idee war zuerst zu überprüfen, ob der asynchrone Vorgang ausgeführt wird, abzubrechen und erneut zu starten.

Bisher habe ich versucht, diese Art von Funktionalität mit CancellationTokenSource zu erstellen, aber es funktioniert nicht wie erwartet. Manchmal werden zwei asynchrone Vorgänge ausgeführt, sodass die "alten" asynchronen Vorgänge noch nicht abgebrochen werden, wenn ich einen neuen starte. Dadurch wird die Verarbeitung der Ergebnisse durcheinander gebracht.

Irgendwelche Vorschläge oder Beispiele, wie man mit dieser Art von Fall umgeht?

public async void Draw()
{
    bool result = false;

    if (this.cts == null)
    {
        this.cts = new CancellationTokenSource();

        try
        {
            result = await this.DrawContent(this.TimePeriod, this.cts.Token);
        }
        catch (Exception ex)
        {}
        finally
        {
            this.cts = null;
        }
    }

    else
    {
        this.cts.Cancel();
        this.cts = new CancellationTokenSource();

        try
        {
            result = await this.DrawContent(this.TimePeriod, this.cts.Token);
        }
        catch (Exception ex)
        {}
        finally
        {
            this.cts = null;
        }
    }

}

EDIT: Am Ende finde ich es nicht schlecht, dass in kurzer Zeit zwei asynchrone Vorgänge ausgeführt werden (wenn der neue ausgelöst wird, aber der alte noch nicht abgebrochen ist).

Das eigentliche Problem hierbei ist, wie ich den Fortschritt für den Endbenutzer anzeige. Wenn der alte asynchrone Vorgang beendet wird, wird die Fortschrittsanzeige vor dem Endbenutzer ausgeblendet, aber der neu ausgelöste asynchrone Vorgang wird noch ausgeführt.

EDIT2: In DrawContent (...) verwende ich ThrowIfCancellationRequested, so dass das Abbrechen der laufenden Aufgabe in Ordnung zu sein scheint.

Über die Fortschrittsanzeige. Wenn Draw () aufgerufen wird, setze ich das Ladekennzeichen sichtbar und wenn diese Methode endet, verstecke ich das Ladekennzeichen. Wenn also die vorherige asynchrone Operation abgebrochen wird, nachdem ich eine neue gestartet habe, wird meine Ladeanzeige ausgeblendet. Wie kann ich nachverfolgen, ob noch eine andere asynchrone Methode ausgeführt wird, wenn die "alte" endet?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage