J'ai observé, à la fois dans .NET Framework et .NET Core, que Task.Delay() semble terminer plus tôt qu'il ne le devrait. Habituellement, le retard est de l'ordre de 10 usecs, mais en de rares occasions, il peut atteindre quelques msecs. Considérez ce programme :
class Program
{
static void Main(string[] args)
{
Console.WriteLine("TaskDelayTest .NET Framework");
while (true)
{
DateTime now = DateTime.UtcNow;
TimeSpan wait = TimeSpan.FromMilliseconds(1000);
DateTime then = now + wait;
Task delay = Task.Delay(wait);
delay.ContinueWith(Execute, then);
Thread.Sleep(100);
}
}
static void Execute(Task delay, object arg)
{
DateTime later = DateTime.UtcNow;
DateTime then = (DateTime)arg;
if (later < then)
{
Console.WriteLine("Early execute!!!! {0:n0} ns", (then.Ticks - later.Ticks) * 100);
}
}
}
Je m'attendrais à ce que la ligne "Exécution anticipée" ne soit JAMAIS imprimée parce que Task.Delay devrait attendre au moins aussi longtemps comme paramètre de retard. Cependant, ce n'est pas ce que j'observe. Si vous laissez le programme s'exécuter suffisamment longtemps, il finit par afficher le message "Early execute". Ai-je mal interprété la spécification ?
TaskDelayTest .NET Core
Early execute!!!! 199,800 ns
Early execute!!!! 22,200 ns
Early execute!!!! 353,300 ns
Early execute!!!! 571,200 ns
Early execute!!!! 90,700 ns
Early execute!!!! 85,600 ns
Early execute!!!! 9,300 ns
Early execute!!!! 540,600 ns
Early execute!!!! 141,200 ns
Early execute!!!! 107,800 ns
Early execute!!!! 397,200 ns
Early execute!!!! 297,000 ns