我有一个应用程序,其中一部分代码在一个带有定时器延迟的循环中运行。
在申请开始时我宣布:
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--;
行,并且没想到它会在此之前停止。
答案 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;
}