Cancele correctamente la operación asíncrona y vuelva a dispararla

Cómo manejar el caso, donde el usuario puede presionar el botón, lo que invoca el funcionamiento asíncrono de larga ejecución, varias veces.

Mi idea fue primero comprobar si la operación asíncrona se está ejecutando, cancelarla y volver a iniciarla.

Hasta ahora, he intentado crear este tipo de funcionalidad utilizando CanceTokenSource, pero no está funcionando como se esperaba. Algunas veces se ejecutan dos operaciones asíncronas, por lo que las operaciones asíncronas "antiguas" aún no se cancelan cuando comienzo una nueva y esto mezcla el manejo de resultados.

¿Alguna sugerencia o ejemplo de cómo manejar este tipo de caso?

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

}

EDITAR: Al final, creo que no está mal que haya dos operaciones asíncronas ejecutándose en poco tiempo (cuando se activa el nuevo pero el anterior aún no se ha cancelado).

El problema real aquí es cómo muestro el progreso para el usuario final. Al igual que cuando finaliza la antigua operación asíncrona, oculta el indicador de progreso del usuario final, pero la operación asíncrona recién activada aún se está ejecutando.

EDIT2: Dentro de DrawContent (...) Yo uso ThrowIfCancellationRequested, así que cancelar la tarea en ejecución parece funcionar bien.

Acerca de la visualización del progreso. Cuando se llama a Draw (), configuro el indicador de carga visible y cuando este método termina, oculto el indicador de carga. Entonces, cuando la operación asíncrona anterior se cancela después de comenzar una nueva, mi indicador de carga está oculto. ¿Cómo debo realizar un seguimiento si todavía hay otro método asíncrono en ejecución cuando finaliza el método "antiguo"?

Respuestas a la pregunta(3)

Su respuesta a la pregunta