Task.delay wird früher abgeschlossen
Posted: 03 Apr 2025, 01:16
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>
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
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);
}
}
}
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