La plus grande différence entre Task.Delayet Thread.Sleepest qu'il Task.Delayest destiné à s'exécuter de manière asynchrone. Cela n'a aucun sens d'utiliser Task.Delaydu code synchrone. C'est une TRÈS mauvaise idée à utiliser Thread.Sleepen code asynchrone.
Normalement, vous appelez Task.Delay() avec le awaitmot - clé:
await Task.Delay(5000);
ou, si vous souhaitez exécuter du code avant le délai:
var sw = new Stopwatch();
sw.Start();
Task delay = Task.Delay(5000);
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
await delay;
Devinez ce que cela va imprimer? Fonctionne pendant 0,0070048 secondes. Si nous déplaçons ce qui await delayprécède à la Console.WriteLineplace, il imprimera Running pendant 5.0020168 secondes.
Regardons la différence avec 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");
}
}
Essayez de prédire ce que cela va imprimer ...
async: Démarrage
async: Fonctionnement pendant 0.0070048 secondes de
synchronisation: Démarrage
async: Fonctionnement pendant 5.0119008 secondes
async: Terminé
sync: Fonctionnement pendant 5.0020168 secondes
sync: Terminé
En outre, il est intéressant de noter que Thread.Sleepc'est beaucoup plus précis, la précision ms n'est pas vraiment un problème, alors qu'elle Task.Delaypeut prendre 15-30 ms minimum. Les frais généraux sur les deux fonctions sont minimes par rapport à la précision en ms qu'ils ont (utilisez StopwatchClass si vous avez besoin de quelque chose de plus précis). Thread.Sleepattache toujours votre fil, Task.Delayrelâchez-le pour effectuer d'autres travaux pendant que vous attendez.