我是否需要创建一个新的CancellationTokenSource();任务取消后?

时间:2017-08-28 09:05:37

标签: c#

我有这样的应用程序:

我有一个应用程序,其中一部分代码在一个带有定时器延迟的循环中运行。在申请开始时我宣布:

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();

或者我可以继续重复使用吗?

2 个答案:

答案 0 :(得分:3)

如果要重置取消令牌的状态,则无法执行此操作。您必须重新创建CancellationTokenSource

答案 1 :(得分:2)

CancellationToken以及任务是一次性实体,应在使用后丢弃。

你的基本方法是:

  • 创建CancellationTokenSource;
  • 点击任务并传递它们({1}};
  • 等待任务完成,取消或失败;
  • 如果您需要重复操作,请转到第一个列表项。