C# · Avançado · Inglês · Técnico
ValueTask
Struct que representa uma operação assíncrona sem alocar um Task quando o resultado já está pronto. Reduz alocações em caminhos que costumam completar de forma síncrona.
Onde usar
Aparece em APIs de alto volume, como leitura de streams e caches, onde muitas chamadas voltam do cache sem esperar. Cada ValueTask deve ser aguardado uma única vez; guardá-lo ou reutilizá-lo gera bugs sutis.
Em código
async ValueTask<int> ObterAsync(int id)
{
if (_cache.TryGetValue(id, out var v))
return v; // sem alocar Task
v = await CarregarAsync(id);
return _cache[id] = v;
}Exemplos
This hot path returns a ValueTask to skip the allocation.
Esse caminho quente retorna um ValueTask para evitar a alocação.
Never await a ValueTask twice.
Nunca dê await duas vezes em um ValueTask.
Cuidado
Não troque Task por ValueTask por padrão: ele é mais restrito (não faça await duas vezes nem use .Result antes de concluir) e só compensa com medições.