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

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:
| Method | Mean | Error | StdDev | Gen0 | Allocated |
|---|---|---|---|---|---|
| TaskUsage | 4.1118ns | 2.1410ns | 0.1174ns | 0.0043 | 72 B |
| ValueTaskUsage | 0.0000ns | 0.0000ns | 0.0000ns | - | - |
ValueTaskevita 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.Tasksempre aloca, mesmo quando já se tem um valor pronto, resultando em maior custo e tempo.