2013-03-25 31 views
10

Kullanıcı, ekrana dokunduğunda bir ses çalan bu yönteme sahibim, & Kullanıcı tekrar ekrana dokunduğunda oynatmayı durdurmak istiyorum. Ama sorun "DoSomething()" metodu durmuyor, bitene kadar devam ediyor.basitçe async yöntemini durdurma

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

Herhangi bir yardım için teşekkür ederiz.
Teşekkürler :)

+0

deneyin ilan '' uçucu bool keepdoing = true olarak keepdoing'; 'Ama doingsomething' dönmek için çok uzun sürüyor' eğer kullanıcı ekranı iki kez bu şekilde yanlış olarak 'keepdoing' geçmek ve geri true basabilirsiniz. –

+0

doingsomething uzun sürmez, ancak döngü nedeniyle, Dosomething() zaman alır. & Söylemek için üzgünüm, ama uçucu işe yaramadı. – Jaydeep

+0

Uçucu sorun değil, çünkü beklemeden sonra kod her zaman UI iş parçacığına gönderilir ... onun bir eşitleme sorunu değil. –

cevap

23

CancellationToken bunun için nedir.

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

Eğer 'cts' öğesini "null" olarak ayarlayan bir "nihayet" bloğu olmalı mı? Tamamlanmış (iptal edilmemiş) bir çalışmanın ardından, 'DoSomethingAsync' komutunu çalıştırmak için 2 dokunuş gerekir. – Gusdor

+0

@Gusdor: İyi yakalama! Bir düzeltmede düzenledim. Bu büyük * değil * - CTS sadece GCed yerine yeniden kullanılabilir, ancak genel noktayı alır. –

İlgili konular