Выбор ответа Senior async/await и Task обновлено

Когда ValueTask, а когда Task

Вопрос

Какое утверждение о ValueTask<T> верно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Полезен при частом синхронном результате, но ждать его дважды нельзя. ValueTask<T это структура, которая может содержать готовый результат без аллокации Task.

Варианты ответа

  1. Всегда быстрее Task<T>, поэтому должен быть типом по умолчанию
  2. Его можно ожидать сколько угодно раз и из разных потоков сразу
  3. Полезен при частом синхронном результате, но ждать его дважды нельзяправильный ответ
  4. Он выполняется на стеке и потому вообще не использует пул потоков

Разбор

ValueTask<T> это структура, которая может содержать готовый результат без аллокации Task. Выгода есть, когда метод часто завершается синхронно. Ограничения: ожидать только один раз, не вызывать .Result до завершения, не ожидать конкурентно. Если нужно больше, вызывают .AsTask(). По умолчанию рекомендуют Task: он проще и безопаснее. С пулом потоков ValueTask никак не связан.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме