Найбільша різниця між 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");
}
}
Спробуйте передбачити, що це буде надрукувати ...
async: запуск
асинхронізації: запуск
синхронізації 0,0070048 секунд : запуск
асинхронізації: запуск 5,0119008 секунд
асинхронізація:
синхронізація завершена : запуск 5,0020168 секунд
синхронізація: завершено
Крім того, цікаво помітити, що Thread.Sleep
набагато точніше, точність мс насправді не є проблемою, хоча Task.Delay
може тривати 15-30 мс мінімально. Накладні витрати на обидві функції мінімальні порівняно з точністю мс, яку вони мають (використовуйте Stopwatch
Class, якщо вам потрібно щось більш точне). Thread.Sleep
як і раніше зав'язуєте свою нитку, Task.Delay
відпустіть її, щоб виконувати інші роботи, поки ви чекаєте.