Search code examples
c#windows-phoneasync-await

simply stop an async method


I have this method which plays a sound, when the user taps on the screen, & I want it to stop playing it when the user taps the screen again. But the problem is "DoSomething()" method doesn't stop, it keeps going till it finishes.

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

Any help will be appreciated.
Thanks :)


Solution

  • This is what a CancellationToken is for.

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