2015-05-27 3 views
18

This blog post упоминает новые API-интерфейсы задач, включая новое свойство Task.CompletedTask, представленное в .NET 4.6.Что такое задача .NET 4.6 Task.CompletedTask?

Почему это было добавлено? Как это лучше, чем, скажем, Task.FromResult(whatever)?

+3

Неяснее намерение? – svick

+0

Причина в том, что вы можете освободить память, создав статические неизменные задачи, которые находятся в фиксированных состояниях. Если вам нужно вернуть завершенную задачу, так как, например, вы только необязательно загружаете материал из сети и в противном случае возвращаете фиктивную задачу, которая настроена на завершение, чтобы вызывающий пользователь, ожидающий вашей задачи, мог продолжить работу сразу. До сих пор вам нужно было создать свой собственный экземпляр и кешировать его или создавать его каждый раз снова через TaskCompletionSource. –

+0

Сообщение в блоге уже объясняет, почему «Task.CompletedTask» был добавлен ... В нем конкретно упоминается «код библиотеки, который заботится о производительности и избегает распределения». Теперь сравните это с вашим 'Task.FromResult (что угодно)': это позволяет избежать выделения? Нет, нет. – hvd

ответ

24

Task.FromResult(whatever) работает для Task<TResult>, но до 4.6 не было ничего для неонной задачи. Вы можете использовать FromResult с фиктивным значением и неявным образом отнести его на Task, но это несколько запутывает намерение (вы не возвращаете какое-либо асинхронное значение значение) и выделяет объекты под ним (тогда как CompletedTask можно кэшировать и совместно использовать между всеми абонентами) ,

В обычных (4.5.2 и более ранних версиях) кодовых базах нередко можно увидеть выполненные пользователем статические завершенные задачи, поэтому, на мой взгляд, имеет смысл включить его в саму структуру.

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

  • Нет связанных вопросов^_^