Cancele corretamente a operação assíncrona e dispare-a novamente

Como lidar com maiúsculas e minúsculas, em que o usuário pode pressionar o botão, que chama a operação assíncrona de execução longa, várias vezes.

Minha idéia foi verificar primeiro se a operação assíncrona está sendo executada, cancelá-la e acioná-la novamente.

Até o momento, tentei criar esse tipo de funcionalidade usando CancellationTokenSource, mas não está funcionando conforme o esperado. Algumas vezes, existem duas operações assíncronas em execução, portanto as operações assíncronas "antigas" ainda não são canceladas quando inicio uma nova e isso confunde a manipulação de resultados.

Alguma sugestão ou exemplo de como lidar com esse 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;
        }
    }

}

EDIT: No final, acho que não é ruim que haja duas operações assíncronas em execução em pouco tempo (quando o novo é acionado, mas o antigo ainda não foi cancelado).

O verdadeiro problema aqui é como eu mostro o progresso do usuário final. Como quando a operação assíncrona antiga termina, oculta o indicador de progresso do usuário final, mas a operação assíncrona recém-acionada ainda está em execução.

EDIT2: Inside DrawContent (...) Eu uso ThrowIfCancellationRequested, portanto, o cancelamento da tarefa em execução parece funcionar corretamente.

Sobre a exibição do progresso. Quando o Draw () é chamado, defino o indicador de carregamento visível e, quando esse método termina, oculto o indicador de carregamento. Portanto, agora, quando a operação assíncrona anterior é cancelada após iniciar uma nova, meu indicador de carregamento fica oculto. Como devo acompanhar se ainda existe outro método assíncrono em execução quando o "antigo" termina.

questionAnswers(3)

yourAnswerToTheQuestion