2013-03-25 33 views
10

Tôi có phương pháp này phát âm thanh, khi người dùng chạm vào màn hình, & Tôi muốn ngừng phát khi người dùng chạm lại vào màn hình. Nhưng vấn đề là phương pháp "DoSomething()" không dừng lại, nó vẫn tiếp tục cho đến khi nó kết thúc.chỉ cần dừng phương thức không đồng bộ

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

Mọi trợ giúp sẽ được đánh giá cao.
Cảm ơn :)

+0

Hãy thử tuyên bố 'keepdoing' là 'dễ bay hơi bool keepdoing = true;' Nhưng nếu 'doingsomething' mất quá nhiều thời gian để trả về, người dùng có thể nhấn vào màn hình hai lần do đó chuyển đổi qua lại' keepdoing' false và trở lại thành sự thật. –

+0

doingsomething không mất nhiều thời gian, nhưng do vòng lặp, Dosomething() cần thời gian. & Tôi xin lỗi để nói, nhưng dễ bay hơi không hoạt động. – Jaydeep

+0

Dễ bay hơi không phải là vấn đề, bởi vì mã sau khi chờ đợi luôn được gửi trở lại chủ đề giao diện người dùng ... nó không phải là vấn đề đồng bộ hóa. –

Trả lời

23

Đây là những gì mà CancellationToken dành cho.

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

Nếu có một khối 'cuối cùng' đặt' cts' thành 'null'? Sau khi hoàn thành (không bị hủy) chạy, 2 vòi sẽ được yêu cầu chạy 'DoSomethingAsync'. – Gusdor

+0

@Gusdor: Tốt bắt! Tôi đã chỉnh sửa trong bản sửa lỗi. Nó không * tuyệt vời * - CTS có thể được tái sử dụng thay vì chỉ GCed, nhưng nó được điểm chung trên. –

Các vấn đề liên quan