Изменение сигнатуры вашего метода для возврата ValueTask
вместо Task
:
async ValueTask<int> ParseStreamAsync()
{
var a = await reader.ReadInt32Async();
var b = await reader.ReadInt32Async();
return a + b;
}
... имеет то преимущество, что вызывающие ваш метод методы будут избегать выделения объекта в случае, если оба Звонки на номер reader.ReadInt32Async
будут выполняться синхронно. Но это не может быть большим преимуществом, потому что два вызова reader.ReadInt32Async
могут по-прежнему выделять объект Task
каждый, в зависимости от того, как реализован этот метод. Теоретически возможно, что некоторые общие Task<Int32>
возвращаемые значения будут кэшироваться, но на практике это маловероятно. Было бы иначе, если бы возвращаемое значение было Task<bool>
, при кэшировании только два возможных значения были бы дешевыми. Кэширование Task<TResult>
объектов было единственным доступным способом сокращения выделения ресурсов до введения ValueTask
s.
Так что, используя ValueTask
вместо Task
, можно разумно ожидать, что вы уменьшите объект ассигнования от 3 до 2 на каждый вызов, что не очень впечатляет, но и не незначительно.