如何停止在while循环中运行的运行计时器?

时间:2017-08-28 06:58:37

标签: c# xamarin

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

在申请开始时我宣布:

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

这是循环区域:

 while (App.runCardTimer && App.TimerSeconds > 0)
 {
   App.Timer1Running = true;    
   …
   await Task.Delay(1000, App.tokenSource1.Token);
   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()

然而它似乎停止了。

有没有人有任何想法我可能做错了什么。我原本以为代码会立即转到App.TimerSeconds--;行,并且没想到它会在此之前停止。

1 个答案:

答案 0 :(得分:1)

await Task.Delay(1000, App.tokenSource1.Token);在被取消时抛出System.Threading.Tasks.TaskCanceledException
所以你需要把它包装在try-catch中:

{
   App.Timer1Running = true;    
   …
   try
   {
      await Task.Delay(1000, App.tokenSource1.Token);
   }
   catch(TaskCanceledException ex){}
   App.TimerSeconds--;       
   App.Timer1Running = false;    
}