Самое большое различие между Task.Delayи Thread.Sleepзаключается в том, что Task.Delayон предназначен для асинхронной работы. Не имеет смысла использовать Task.Delayв синхронном коде. Это ОЧЕНЬ плохая идея для использования Thread.Sleepв асинхронном коде.
Обычно вы будете звонить Task.Delay() с awaitключевым словом:
await Task.Delay(5000);
или, если вы хотите запустить некоторый код до задержки:
var sw = new Stopwatch();
sw.Start();
Task delay = Task.Delay(5000);
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
await delay;
Угадайте, что это будет печатать? Запуск за 0,0070048 секунд. Если вместо этого переместить await delayвышеуказанное Console.WriteLine, будет напечатано «Запуск в течение 5.0020168 секунд».
Давайте посмотрим на разницу с Thread.Sleep:
class Program
{
static void Main(string[] args)
{
Task delay = asyncTask();
syncCode();
delay.Wait();
Console.ReadLine();
}
static async Task asyncTask()
{
var sw = new Stopwatch();
sw.Start();
Console.WriteLine("async: Starting");
Task delay = Task.Delay(5000);
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
await delay;
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
Console.WriteLine("async: Done");
}
static void syncCode()
{
var sw = new Stopwatch();
sw.Start();
Console.WriteLine("sync: Starting");
Thread.Sleep(5000);
Console.WriteLine("sync: Running for {0} seconds", sw.Elapsed.TotalSeconds);
Console.WriteLine("sync: Done");
}
}
Попробуйте предсказать, что это будет печатать ...
асинхронный: запуск
асинхронного: запуск в течение 0,0070048 секунд
синхронизация: запуск
асинхронного: запуск в течение 5,0119008 секунд
асинхронный запуск :
синхронизация: запуск в течение 5,0020168 секунд
синхронизация: выполнено
Кроме того, интересно отметить, что Thread.Sleepэто гораздо более точно, точность мс не является проблемой, хотя Task.Delayможет занять минимум 15-30 мс. Затраты на обе функции минимальны по сравнению с точностью до мс, которую они имеют (используйте StopwatchClass, если вам нужно что-то более точное). Thread.Sleepвсе еще связывает свою Нить, Task.Delayотпустите ее для выполнения другой работы, пока вы ждете.