Page 1 of 1

Task.delay wird früher abgeschlossen

Posted: 03 Apr 2025, 01:16
by Anonymous
Ich habe sowohl in .NET Framework als auch in .NET Core beobachtet, dass Task.delay () früher zu vervollständigen scheint, als es sollte. Normalerweise ist der Usecs der Minderjährige 10, aber bei seltenen Fällen kann es so viel MSCs betragen. Betrachten Sie dieses Programm: < /p>

Code: Select all

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);
}
}
}
Ich würde erwarten, dass die Zeile "Early Execute" niemals gedruckt wird, weil Task.delay mindestens so lange wie der Verzögerungsparameter warten sollte. Dies ist jedoch nicht das, was ich beobachte. Wenn Sie zulassen, dass das Programm lange genug ausgeführt wird, druckt es "Early Execute" aus. Habe ich die Spezifikation hier falsch interpretiert?

Code: Select all

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