2015-08-15 2 views
7

Я читал, что Task.Delay() рекомендуется ждать, чтобы не блокировать вызывающий поток (как это было указано в Task.Delay(). Wait() и Thread.Sleep()). Но поскольку я узнал больше об async/await, у меня появилось ощущение, что все, что он делает, - это перенос ожидаемой задачи для выполнения в другом потоке.«Ожидает Task.Delay (1000)» блокирует ЛЮБОЙ поток?

Итак, правильно ли я это понял: ждать Task.Delay() не блокирует вызывающий поток, однако он блокирует поток NOME, в котором ожидаемая задача переключается на?

Если это утверждение ИСТИННО, то вы могли бы посоветовать мне метод, который просит задачу подождать некоторое время БЕЗ блокировки любого потока во время ожидания?

+2

У меня есть сообщение в блоге, в котором [подробно рассматривается как работает async без блокировки потока] (http: // blog .stephencleary.com/2013/11/там-нет-нет-thread.html). –

ответ

14

однако он блокирует некоторую нить, где ожидаемая задача переключается на?

Это зависит от того, что вы подразумеваете под «блоком». Он не вызывает нить, чтобы заснуть в течение 1 секунды или (что еще хуже), чтобы ждать завершения задержки. Вместо этого он эффективно планирует таймер запускать за 1 секунду, а затем выполняет продолжение, которое будет зарегистрировано из-за await.

В несколько упрощенном уровне await просто переводит:

  • Зов GetAwaiter на awaitable, чтобы получить awaiter
  • Проверьте, есть ли awaiter уже завершена - если это так, просто продолжать
  • В противном случае планируйте продолжение с помощью awaiter и возвращайте
  • Когда awaiter завершается, вызывается продолжение и продолжается асинхронный метод

Умный бит - это способ, которым компилятор сохраняет состояние и управляет продолжением, чтобы он продолжался с конца выражения await.

+0

Как я понял, поток, на который отправляется ожидаемая задача Delay(), может быть использован для обработки других задач, а Delay() выполняется? – cubrman

+0

@cubrman: Что вы подразумеваете под «где отправляется ожидаемая задача Delay()»? 'Delay()' возвращает 'Task', и эта задача завершается второй позже ... это не похоже на то, что это задача, которая на самом деле * делает * что-либо. Если вам нравится, как работает System.Timers.Timer (или аналогичный), это похоже на это. –

+0

@cubrman «Задержка» не происходит в процессе. Это происходит на аппаратной части, называемой часами/таймером. Он никоим образом не берет ресурсы из логической части программы CPU. – Aron

-1

Так как я получаю его, то нить, где ждало Delay() задачи отправляется в> может быть использована для обработки других задач, в то время как Delay() находится в пути? - cubrman Aug> 15 at 10:19

Нет, вы не можете делать другие вещи, пока ждете task.delay. Приведенная ниже инструкция не будет выполнена, но поток также не будет заблокирован! Это означает, что обработка интерфейса все равно будет работать, вы могли бы, например, перемещать мышь, кнопки кликов и т. Д.

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