Самое большое различие между 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 мс. Затраты на обе функции минимальны по сравнению с точностью до мс, которую они имеют (используйте Stopwatch
Class, если вам нужно что-то более точное). Thread.Sleep
все еще связывает свою Нить, Task.Delay
отпустите ее для выполнения другой работы, пока вы ждете.