В новой редакции языка появилось новшество ValueTask . Правильно ли я понимаю, что его следует использовать в том случае, когда есть вероятность, что задача выполнится быстрее,чем я вызову await? Обычный Task умер или все таки в каких-то случаях его нужно использовать?
Ответ описание в разделе Generalized async return types Возврат Task из асинхронных методов, в некоторых случаях может стать узким местом в производительности. Task – это ссылочный тип, поэтому при его использовании память под объект будет выделяться в куче. В случаях, когда метод с модификатором async возвращает кэшированный результат, или выполняется синхронно, дополнительное выделение памяти в куче может занимать значительное время в критических секциях кода. Это может стать очень дорогим, если данные выделения будут происходить в циклах. новые возможности языка позволяют возвращать из асинхронных методов другие типы, кроме Task, Task и void. Возвращаемый тип по прежнему должен удовлетворять асинхронному шаблону, то есть должен быть доступен метод GetAwaiter. В качестве конкретного примере в .NET framework был добавлен тип ValueTask для использования новой возможности: public async ValueTask Func() { await Task.Delay(100) return 5 } Простой оптимизацией может стать использование ValueTask там, где ранее использовался Task. Однако, если хочется добавить дополнительную оптимизацию вручную, можно кэшировать результаты асинхронной работы и использовать эти результаты в последующих вызовах. У структуры ValueTask есть конструктор принимающий Task в качестве параметра, так что можно создать ValueTask из возвращаемого значения любого существующего асинхронного метода: public ValueTask CachedFunc() { return (cache) ? new ValueTask(cacheResult) : new ValueTask(LoadCache()) } private bool cache = false private int cacheResult private async Task LoadCache() { // simulate async work: await Task.Delay(100) cacheResult = 100 cache = true return cacheResult } Как и в случаях со всеми рекомендациями по производительности, перед внесением в код масштабных изменений следует сравнить результаты обоих подходов.