2013-03-25 13 views
10

Mam tę metodę, która odtwarza dźwięk, kiedy użytkownik stuka w ekran, & Chcę, aby przestał grać, gdy użytkownik ponownie dotknie ekranu. Ale problem polega na tym, że metoda "DoSomething()" nie zatrzymuje się, trwa aż do końca.po prostu zatrzymaj metodę asynchroniczną

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

Każda pomoc zostanie doceniona.
Pozdrowienia :)

+0

Spróbuj deklarując '' keepdoing' jako lotnego bool keepdoing = true; '' doingsomething' Ale jeśli trwa zbyt długo, aby wrócić, użytkownik mógłby nacisnąć ekran dwa razy w ten sposób przełączanie 'keepdoing' false iz powrotem na true. –

+0

doingsomething nie trwa długo, ale ze względu na pętlę, Dosomething() wymaga czasu. i przykro mi to mówić, ale lotny nie działał. – Jaydeep

+0

Niestabilna nie jest problemem, ponieważ kod po oczekiwaniu jest zawsze wysyłany z powrotem do wątku interfejsu użytkownika ... nie jest to problem z synchronizacją. –

Odpowiedz

23

Oto, do czego służy 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; 
} 
+1

Czy powinien istnieć blok 'finally', który ustawia' cts' na 'null'? Po pełnym (nieodwołanym) uruchomieniu wymagane będą 2 dotknięcia, aby uruchomić 'DoSomethingAsync'. – Gusdor

+0

@Gusdor: Dobry haczyk! Edytowałem w poprawce. Nie jest to * świetne * - CTS może być ponownie użyty zamiast tylko GCed, ale ma to ogólną wartość. –

Powiązane problemy