2017-08-28 25 views
0

我有這樣的應用程序:我是否需要創建一個新的CancellationTokenSource();任務取消後?

我有一個應用程序,其中一部分代碼運行在一個帶有定時器延遲的循環中。在應用程序的開始,我宣佈:

public static CancellationTokenSource tokenSource1 = new CancellationTokenSource(); 
public static bool Timer1Running; 

這裏的循環區域:

while (App.runCardTimer && App.TimerSeconds > 0) 
{ 
    App.Timer1Running = true;  
    … 
    try 
    { 
     await Task.Delay(1000, App.tokenSource2.Token); 
    } 
    catch (TaskCanceledException ex) { } 
    App.TimerSeconds--;  
    App.Timer1Running = false;  
} 

我的應用程序響應在屏幕上點擊這樣的:

wordGrid.GestureRecognizers.Add(  
    new TapGestureRecognizer()  
    {   
     Command = new Command(() =>   
     {   
     App.TimerSeconds = 0;   
     if (App.tokenSource1 != null && App.Timer1Running)   
     {    
      App.tokenSource1.Cancel();   
     }  
     })  
    }); 

我很困惑關於取消令牌。有一次,我發出的聲明:

App.tokenSource1.Cancel(); 

我需要創建一個新的取消標記是這樣的:

tokenSource1 = new CancellationTokenSource(); 

或者,我可以繼續重用?

回答

1

CancellationToken s以及任務是一次性實體,使用後應扔掉。

在你的情況下基本做法是:

  • 創建CancellationTokenSource; (他們)CancellationToken;
  • 等待任務完成,取消或失敗;
  • 如果您需要重複操作,請轉至第一個列表項。
3

如果你想重置取消令牌的狀態,那麼沒有辦法做到這一點。您必須重新創建CancellationTokenSource

+0

我可以在異常中執行此操作,或者可以在定時器的while循環之前執行此操作(即多次調用循環時) – Alan2

相關問題