Thread.Sleep(2500) по сравнению с Task.Delay(2500).Wait()

Мне нужна определенная ясность. Я знаю, что Task.Delay будет внутренне использовать таймер, и он, очевидно, основан на задачах (ожидается), тогда как Thread.Sleep приведет к блокировке потока. Однако вызывает ли вызов. Подождите, чтобы задача запустила поток?

Если нет, можно предположить, что Task.Delay(2500).Wait() лучше, чем Thread.Sleep(2500). Это немного отличается от SO question/answer here, поскольку я звоню .Wait().

Ответ 1

Использование Wait в незавершенной задаче действительно блокирует поток до завершения задачи.

Использование Thread.Sleep более четкое, поскольку вы явно блокируете поток вместо неявной блокировки задачи.

Единственным способом использования Task.Delay является то, что он позволяет использовать CancellationToken, чтобы вы могли отменить блок, если хотите.

Ответ 2

Thread.Sleep(...) создает событие, чтобы разбудить вас в X миллисекунге, а затем помещает ваш поток в режим сна... в X миллисекунде событие разбудит вас.

Task.Delay(...).Wait() создает событие для запуска задачи в X millisec, затем помещает ваш поток в режим ожидания до тех пор, пока задача не будет выполнена (с Wait)... в X millisec, событие запускает задачу, которая заканчивается немедленно, а затем просыпается вы.

В принципе, они оба очень похожи. Единственное различие заключается в том, что если вы хотите проснуться раньше из другого потока, вы не будете использовать тот же метод.