2017-08-28 41 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();   
     }  
     })  
    }); 

私は混乱していますキャンセルトークンについて私は文を発行すると:

tokenSource1 = new CancellationTokenSource(); 

または私は再利用し続けることができます。

App.tokenSource1.Cancel(); 

私はこのような新しいキャンセルトークンを作成する必要がありますか?

答えて

1

CancellationTokenとタスクは1回限りのエンティティであり、使用後に破棄する必要があります。あなたの場合は

基本的な考え方は次のようになります。

  • CancellationTokenSourceを作成します。
  • 火災のタスク(秒)とそれを渡す(それら)CancellationToken;
  • タスクの完了、キャンセルまたは失敗を待ちます。
  • 操作を繰り返す必要がある場合は、最初のリスト項目に進みます。
3

キャンセルトークンの状態をリセットしたい場合、これを行う方法はありません。 CancellationTokenSourceを再作成する必要があります。

+0

私は例外でこれを行うことができますか、あるいは、私はそれをタイマーのwhileループの直前に行うことができますか(そのループは複数回呼び出されます) – Alan2

関連する問題