Największa różnica między Task.Delayi Thread.Sleeppolega na tym, że Task.Delayma on działać asynchronicznie. Nie ma sensu używać Task.Delayw kodzie synchronicznym. Używanie Thread.Sleepw kodzie asynchronicznym jest BARDZO złym pomysłem .
Zwykle zadzwonisz Task.Delay() ze awaitsłowem kluczowym:
await Task.Delay(5000);
lub, jeśli chcesz uruchomić jakiś kod przed opóźnieniem:
var sw = new Stopwatch();
sw.Start();
Task delay = Task.Delay(5000);
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
await delay;
Zgadnij, co to wydrukuje? Działa przez 0,0070048 sekund. Jeśli zamiast tego przeniesiemy await delaypowyższe Console.WriteLine, zostanie wydrukowany Uruchomiony przez 5.0020168 sekund.
Spójrzmy na różnicę w 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");
}
}
Spróbuj przewidzieć, co to wydrukuje ...
async: Uruchamianie
asynchronizacji: Uruchamianie przez 0,0070048 sekund
Synchronizacja: Uruchamianie
asynchronizacji: Uruchamianie 5,0119008 sekund Asynchronizacja
: Gotowe
Synchronizacja: Uruchamianie 5.0020168 sekund
Synchronizacja: Gotowe
Warto również zauważyć, że Thread.Sleepjest o wiele dokładniejszy, dokładność ms nie jest tak naprawdę problemem, a Task.Delaymoże zająć minimum 15-30 ms. Narzut na obie funkcje jest minimalny w porównaniu z dokładnością ms, jaką mają (użyj Stopwatchklasy, jeśli potrzebujesz czegoś dokładniejszego). Thread.Sleepnadal wiąże Wątek, Task.Delayzwolnij go, aby mógł wykonać inną pracę podczas oczekiwania.