ExpertiDict

C# · Avançado · Inglês · Técnico

ValueTask

/ˈvælju tæsk/substantivo

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.

Veja também

Todos os termos de C#