ValueTask<T> is the return type people reach for when they have heard that Task allocates, and then use everywhere. That is the wrong lesson. ValueTask solves one specific problem, it solves it very well, and it comes with rules that Task does not have. What it is ValueTask<T> is a struct holding one of three things: a TResult directly, for a synchronous success, a Task<TResult>, for the asynchronous… [read more]