Просто прекратите асинхронный метод

У меня есть этот метод, который воспроизводит звук, когда пользователь нажимает на экран, и я хочу, чтобы он переставал воспроизводить его, когда пользователь снова забирает экран. Но проблема в том, что метод "DoSomething()" не останавливается, он продолжает работать до завершения.

bool keepdoing = true;

private async void ScreenTap(object sender, System.Windows.Input.GestureEventArgs e)
    {
        keepdoing = !keepdoing;
        if (!playing) { DoSomething(); }
    }

private async void DoSomething() 
    {
        playing = true;
        for (int i = 0; keepdoing ; count++)
        {
            await doingsomething(text);
        }
        playing = false;
    }

Любая помощь будет оценена. Спасибо:)

Ответ 1

Вот что для CancellationToken.

CancellationTokenSource cts;

private async void ScreenTap(object sender, System.Windows.Input.GestureEventArgs e)
{
  if (cts == null)
  {
    cts = new CancellationTokenSource();
    try
    {
      await DoSomethingAsync(cts.Token);
    }
    catch (OperationCanceledException)
    {
    }
    finally
    {
      cts = null;
    }
  }
  else
  {
    cts.Cancel();
    cts = null;
  }
}

private async Task DoSomethingAsync(CancellationToken token) 
{
  playing = true;
  for (int i = 0; ; count++)
  {
    token.ThrowIfCancellationRequested();
    await doingsomethingAsync(text, token);
  }
  playing = false;
}