- Thread.Sleep()是同步延迟,会阻塞當前线程;Task.Delay()是异步延迟,如果用在同步代碼中使用,不会阻塞當前线程,也沒有意義。
- Thread.Sleep()不能取消;Task.Delay()可以,可與async/await和CancellationTokenSource组合起来使用。
- 在异步代码中使用Thread.Sleep()是不好的選擇。通常使用await关键字调用Task.Delay()。
一個例子:
private async void button12_Click(object sender, EventArgs e)
{
Stopwatch start = Stopwatch.StartNew();//測試用,計時器
Task t = Task.Run(() =>
{
for (int i = 0; i <= 100; i++)
{
progressBar1.Invoke(new Action(() => {
progressBar1.Value = i;
}));
Thread.Sleep(100);
// await Task.Delay(1000);//這里不能用 Task.Delay(1000), 在for循環的同步代碼中使用它沒有意義。 當然同步代碼中此處也不能用 await Task.Delay
}
});
await t;
//await Task.Delay(10000);//再等待10秒
lblMsg.Text += ($"{ start.ElapsedMilliseconds.ToString()}");
}