經測試對比,兩種延時策略有以下區別:
若采用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);
}
經測試對比,問題出在Task.Delay語句,修改為:Thread.Sleep就一切OK了,不需要await修飾或.wait()。這樣,循環中的Task.Status一直為Running,退出循環即為RanToCompletion。