Skip to main content

Thread, Task and ValueTask

  • Thread, Task and ValueTask

Fire and Forget | CSharp

  • Para executar um método assíncrono e não aguardar o retorno | fire and forget
public IActionResult MeuMetodo()
{
// Iniciar a tarefa assíncrona sem aguardar sua conclusão
_ = MeuMetodoAssincrono();

// Retornar uma resposta para o usuário imediatamente
return Ok("Tarefa iniciada em segundo plano.");
}

private async Task MeuMetodoAssincrono()
{
// Lógica assíncrona aqui
// ...
await Task.Delay(5000); // Exemplo de espera simulada de 5 segundos
// ...
// Fazer qualquer outra operação desejada
}

Exemplo do funcionamento do Thread Pool

alt text

ValueTask

Quando você tem um resultado muito rápido como por exemplo um retorno vindo de cache, utilizar o ValueTask traz uma performance excelente

public class TaskVsValueTask
{
string value = string.Empty;

[GlobalSetup]
public void Setup() => value = "myData";

[Benchmark]
public Task<string> TaskUsage() => Task.FromResult(value);

[Benchmark]
public ValueTask<string> ValueTaskUsage() => ValueTask.FromResult(value);
}

Resultados do benchmark:

MethodMeanErrorStdDevGen0Allocated
TaskUsage4.1118ns2.1410ns0.1174ns0.004372 B
ValueTaskUsage0.0000ns0.0000ns0.0000ns--
  • ValueTask evita alocação de memória quando o resultado já está disponível (sincrônico), tornando-o mais rápido e sem custo de heap allocation.
  • Task sempre aloca, mesmo quando já se tem um valor pronto, resultando em maior custo e tempo.