先上结论:对于 Task.Delay() 的取消,需要去处理异常 TaskCanceledException ,否则会将整个Task取消。
功能:程序需要定时执行数据库数据查询,并在某些配置参数修改后,立即刷新数据:
执行以下代码,Cancellation.Cancel() 后不会有 "t1 完成等待" 出现,说明程序并没有按照设想的方式执行。
static CancellationTokenSource Cancellation = new CancellationTokenSource();
static void Main(string[] args)
{
Task t1 = MainTask();//主任务
Thread.Sleep(1000);
Cancellation.Cancel();//取消t1中的等待,立即执行任务主内容
Console.ReadKey();
}
private static Task MainTask()
{
var t1 = Task.Run(async () =>
{
//定时操作
while (true)
{
Print("t1 执行某些任务");
Print("t1 开始等待10秒");
await Task.Delay(10000, Cancellation.Token);//等待指定时长,指定可取消任务,是为了在任务外可立即跳过等待去刷新数据
Print("t1 完成等待");
}
});
return t1;
}
static void Print(string msg)
{
Console.WriteLine($"{DateTi