2015-12-02 8 views
4

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

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

+0

Почему это было бы лучше? – i3arnon

+1

Да, '.Wait()' в 'Задача' является блокирующим вызовом. С вашей точки зрения, они по существу были бы эквивалентны. –

+0

С подобной функциональностью, предлагаемой двумя вашими вариантами, я думаю, вам действительно нужно прояснить, что вы подразумеваете под «лучше». –

ответ

9

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

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

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

+0

... Но только если у вас есть другой поток, который может использовать «CancellationToken», поскольку основной поток будет заблокирован. –

+2

@BradleyUffner хорошо, вы можете создать самоотверждающийся токен (используя таймер внутри) ... – i3arnon

5

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

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

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

+0

«Task.Delay (...). Wait() создает событие для запуска задачи в X millisec, а затем помещает ваш поток для сна, пока задача не будет выполнена. «Здесь нет никакой задачи. – Voo

+1

Да, есть один, но он пуст. Задержка возвращает объект Task. –

+1

Да, плохо сформулировано. Никакая задача никогда не начиналась *. Существует только объект задачи, который создается объектом TaskCompletionSource и состояние которого обновляется через некоторое время. – Voo

Смежные вопросы