Task.FromResult(whatever)
работает для Task<TResult>
, но до 4.6 не было ничего для неонной задачи. Вы можете использовать FromResult
с фиктивным значением и неявным образом отнести его на Task
, но это несколько запутывает намерение (вы не возвращаете какое-либо асинхронное значение значение) и выделяет объекты под ним (тогда как CompletedTask
можно кэшировать и совместно использовать между всеми абонентами) ,
В обычных (4.5.2 и более ранних версиях) кодовых базах нередко можно увидеть выполненные пользователем статические завершенные задачи, поэтому, на мой взгляд, имеет смысл включить его в саму структуру.
Неяснее намерение? – svick
Причина в том, что вы можете освободить память, создав статические неизменные задачи, которые находятся в фиксированных состояниях. Если вам нужно вернуть завершенную задачу, так как, например, вы только необязательно загружаете материал из сети и в противном случае возвращаете фиктивную задачу, которая настроена на завершение, чтобы вызывающий пользователь, ожидающий вашей задачи, мог продолжить работу сразу. До сих пор вам нужно было создать свой собственный экземпляр и кешировать его или создавать его каждый раз снова через TaskCompletionSource. –
Сообщение в блоге уже объясняет, почему «Task.CompletedTask» был добавлен ... В нем конкретно упоминается «код библиотеки, который заботится о производительности и избегает распределения». Теперь сравните это с вашим 'Task.FromResult (что угодно)': это позволяет избежать выделения? Нет, нет. – hvd