经测试对比,两种延时策略有以下区别:
若采用await Task.Delay(1000);的延时策略,Task.Status第一遍循环中为Running,以后的循环中全部为RanToCompletion,退出循环后仍然为RanToCompletion;
若采用Task.Delay(1000).Wait();的策略,循环中Task.Status一直为Running,退出循环即为RanToCompletion。
请问:为什么是这样?从测试结果看采用Task.Delay(1000).Wait()似乎更合理,但大家在实际应用中似乎更多使用await Task.Delay(1000),包括MSDN上的例子。
CancellationTokenSource cts = new CancellationTokenSource();
Task taskT;
private void button1_Click(object sender, EventArgs e)
{
taskT = Task.Factory.StartNew(() => t(cts.Token), cts.Token);
}
private async Task t(CancellationToken token)
{
Console.WriteLine("taskT.Status2:{0}", taskT.Status);
while (true)
{
Console.WriteLine();
if (token.IsCancellationRequested)
{
Console.WriteLine("线程被终止!");
break;
}
Console.WriteLine(DateTime.Now.ToString());
Console.WriteLine("taskT.Status3:{0}", taskT.Status);
//await Task.Delay(3000);
Task.Delay(3000).Wait();
//taskT.Wait(3000);
Console.WriteLine("taskT.Status4:{0}", taskT.Status);
}
Console.WriteLine("taskT.Status5:{0}", taskT.Status);
}