主要区别
Thread.Sleep:
挂起当前线程一段时间。
await Task.Delay:
将当前执行代码的线程空出来,优先去执行其他任务。
在等待时间结束后,交给线程池中的线程接继续执行。
这意味着,经过该方法后,执行当前代码的线程可能被切换。
踩到的坑
不知道在经过await之后,执行线程可能被切换。
namespace ConsoleApp;internal class Program
{public static void Main(){Program p = new Program();_thread = new Thread(p.CheckThreadId);_thread.Start();_thread.Join(); // 该方法并未起到实际效果,在任务全完成前,主线程早已结束。// Thread.Sleep(1000 * 10);Console.WriteLine("主线程退出 id:" + Environment.CurrentManagedThreadId);}private static Thread? _thread;private async void CheckThreadId(){for (int i = 0; i < 10; i++){Task taskTimer = Task.Delay(1000);Task task = RunTask(i);var i1 = i;_ = task.ContinueWith(t =>{Console.WriteLine("任务完成:" + i1 + " - " + Environment.CurrentManagedThreadId);});Console.WriteLine("线程id:" + Environment.CurrentManagedThreadId); // 通过输出日志可以发现 在循环过程中线程可能被切换await taskTimer;}}private async Task RunTask(int i){Console.WriteLine("执行任务:" + i + " - " + Environment.CurrentManagedThreadId);await Task.Delay(1);Thread.Sleep(1);}
}