一.
1.Task.Delay實質是創建一個任務,再任務中開啟一個定時間,然后延時指定的時間
2.Task.Delay不和await一起使用情況,當代碼遇到Task.Delay一句時,創建了了一個新的任務去執行延時去了,當前代碼繼續往下執行
3.Task.Delay和await一起使用,當代碼遇到await Task.Delay時候,當前線程要等該行代碼執行完成后,再繼續執行后面的代碼
代碼
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace _006__Task.Delay { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnDelayNoAwait_Click(object sender, EventArgs e) { Task task = Task.Factory.StartNew(() => { Console.WriteLine($" Task.Delay開始:{DateTime.Now.ToString(" HH:mm:ss.fff")}"); for (int i = 0; i < 10; i++) { Console.WriteLine($" {DateTime.Now.ToString("HH:mm:ss.fff")} 正在進行:{i}"); Task.Delay(2000); } Console.WriteLine($" Task.Delay結束:{DateTime.Now.ToString("HH:mm:ss.fff")}"); Console.ReadKey(); }); } private void btnDelayHaveAwait_Click(object sender, EventArgs e) { Task task = Task.Factory.StartNew(async () => { Console.WriteLine($" Task.Delay 有await 開始:{DateTime.Now.ToString("HH:mm:ss.fff")}"); for (int i = 0; i < 10; i++) { Console.WriteLine($" {DateTime.Now.ToString("HH:mm:ss.fff")} 有await正在進行:{i}"); await Task.Delay(2000); } Console.WriteLine($" Task.Delay 有await 結束:{DateTime.Now.ToString("HH:mm:ss.fff")}"); Console.ReadKey(); }); } private void btnThreadSleep_Click(object sender, EventArgs e) { Task task = Task.Factory.StartNew(() => { Console.WriteLine($" Task.Delay 有await 開始:{DateTime.Now.ToString("HH:mm:ss.fff")}"); for (int i = 0; i < 10; i++) { Console.WriteLine($" {DateTime.Now.ToString("HH:mm:ss.fff")} 有await正在進行:{i}"); Thread.Sleep(2000); } Console.WriteLine($" Task.Delay 有await 結束:{DateTime.Now.ToString("HH:mm:ss.fff")}"); Console.ReadKey(); }); } } }
按鈕【Task.Delay(不帶await)】執行結果:
當程序遇到 Task.Delay(2000);時候,程序創建一個新的任務去執行延時2000了,當前任務繼續向下執行,所以看起來並沒有延時2秒的現象。
例如:你只有先寫完作業,然后才能看電視。但是到寫作業的時候,你讓其他人幫你寫(開啟新的任務去執行延時),你繼續去看電視(繼續當前任務)。
按鈕【Task.Delay(帶await)】執行結果(推薦):
當程序遇到 await Task.Delay(2000);時候,當前任務,要等到新創建的任務執行完延時2000后,才繼續后面的代碼
例如:你只有先寫完作業,然后才能看電視。但是到寫作業的時候,你mother在旁邊看着你,直到你寫完作業(開啟新的任務去執行延時),你才可以繼續去看電視(繼續當前任務)。
按鈕【Thread.Sleep()】執行結果(不推薦):
Thread.Sleep 是讓當前線程休眠指定的時間。在異步中是不推薦使用Thread.Sleep 的。