Подтвердить что ты не робот

Если методы, возвращающие Task <T>, всегда запускают возвращенную задачу?

Если у меня есть метод вроде

Task<bool> LongProcessTaskAsync();

Было бы лучше начать возвращенную задачу

return Task<bool>.Factory.StartNew(() => { ... });

или просто return new Task<bool>(() => ...)

Лично я предпочитаю первый метод, но я предпочел бы быть совместимым с другими API и библиотеками.

Возвращает задание, не начатое ранее?

4b9b3361

Ответ 1

В случае методов async/await задача уже будет запущена. AFAIK, все методы BCL, добавленные для задач на основе задач, возвращают уже запущенные задачи. Это было бы странно, если бы не обычный случай потребителя:

var foo = await GetFooAsync();

[ РЕДАКТИРОВАТЬ]. Основываясь на Стивене, указывая на то, что рекомендации TAP касаются этого (и он уже содержит ссылку на рекомендации), я включу цитату соответствующего бита со страницы 4 ( в Асинхронном шаблоне на основе задачи → Поведение → Статус задачи), и я добавил жирный + курсив вокруг ключевых частей.

Состояние задачи

Класс Task обеспечивает жизненный цикл для асинхронных операций и этот цикл представлен перечислением TaskStatus. Чтобы поддерживающие угловые случаи типов, происходящих из задачи и задачи, как а также разделение конструкции от планирования, класс Task выставляет метод "Старт". Задачи, созданные его общественными конструкторами, называемые "холодными" задачами, поскольку они начинают свой жизненный цикл в незапланированное состояние TaskStatus.Created и его не до Start вызывается в этих случаях, что они переходят к запланированному. Все остальные задачи начинают свой жизненный цикл в "горячем" состоянии, что означает, что асинхронные операции, которые они представляют, уже начаты и их TaskStatus - это значение перечисления, отличное от Созданного.

Все задачи, возвращаемые методами TAP, должны быть "горячими". Если метод TAP внутренне использует конструктор "Задачи" для создания экземпляра задачи, метод TAP должен вызвать Start на объекте Task перед возвращая его. Потребители метода TAP могут с уверенностью предположить, что возвращенная задача "горячая" и не должна пытаться вызвать "Пуск" на любом Задача, возвращаемая с помощью метода TAP. Вызов "Начать по" горячей "задаче будет приведет к исключению InvalidOperationException (эта проверка обрабатывается автоматически с помощью класса Task).

Ответ 2

Джеймс Мэннинг правильно ответил. Вот еще один угол: зачем кому-то нужна неуправляемая задача? Если бы он это сделал, он мог просто ждать вызова метода. Он мог бы назвать это позже или обернуть его в ленивом или будущем. Почти никогда не было причины не возвращать запущенную задачу.