La plus grande différence entre Task.Delay
et Thread.Sleep
est qu'il Task.Delay
est destiné à s'exécuter de manière asynchrone. Cela n'a aucun sens d'utiliser Task.Delay
du code synchrone. C'est une TRÈS mauvaise idée à utiliser Thread.Sleep
en code asynchrone.
Normalement, vous appelez Task.Delay()
avec le await
mot - 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 delay
précède à la Console.WriteLine
place, 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.Sleep
c'est beaucoup plus précis, la précision ms n'est pas vraiment un problème, alors qu'elle Task.Delay
peut 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 Stopwatch
Class si vous avez besoin de quelque chose de plus précis). Thread.Sleep
attache toujours votre fil, Task.Delay
relâchez-le pour effectuer d'autres travaux pendant que vous attendez.