Должны ли методы, возвращающие задачу, всегда запускать возвращаемую задачу?

Если у меня есть метод, как

Task<bool> LongProcessTaskAsync();

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

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

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

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

является ли возвращение не запущенной задачи более подходящим?

2 ответов


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

var foo = await GetFooAsync();

[редактировать] основываясь на том, что Стивен указывает, что руководство TAP охватывает это (и он уже включает ссылку на руководство), я включу цитату соответствующего бита со страницы 4 (в асинхронном режиме на основе задач Pattern Defined - > Behavior - > Task Status), и я добавил жирный+курсив вокруг ключевых частей.

Статус Задач

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

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


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