public sealed class ProcessadorDePedidos : BackgroundService
{
private readonly IServiceScopeFactory _escopos;
private readonly ILogger<ProcessadorDePedidos> _log;
protected override async Task ExecuteAsync(CancellationToken ct)
{
await using var escopo = _escopos.CreateAsyncScope();
var db = escopo.ServiceProvider.GetRequiredService<AppDbContext>();
await foreach (var pedido in db.Pedidos
.AsNoTracking()
.Where(p => p.Status == StatusPedido.Pendente)
.OrderBy(p => p.CriadoEm)
.AsAsyncEnumerable()
.WithCancellation(ct))
{
try
{
await _handler.HandleAsync(pedido, ct);
}
catch (DbUpdateConcurrencyException ex)
{
_log.LogWarning(ex, "Conflito de concorrencia em {PedidoId}", pedido.Id);
}
}
}
// ValueTask evita a alocacao quando o caminho quente acerta o cache.
public ValueTask<Cliente?> BuscarAsync(int id) =>
_cache.TryGetValue(id, out var encontrado)
? ValueTask.FromResult<Cliente?>(encontrado)
: new ValueTask<Cliente?>(CarregarDoBancoAsync(id));
}
public sealed class ProcessadorDePedidos : BackgroundService
{
private readonly IServiceScopeFactory _escopos;
private readonly ILogger<ProcessadorDePedidos> _log;
protected override async Task ExecuteAsync(CancellationToken ct)
{
await using var escopo = _escopos.CreateAsyncScope();
var db = escopo.ServiceProvider.GetRequiredService<AppDbContext>();
await foreach (var pedido in db.Pedidos
.AsNoTracking()
.Where(p => p.Status == StatusPedido.Pendente)
.OrderBy(p => p.CriadoEm)
.AsAsyncEnumerable()
.WithCancellation(ct))
{
try
{
await _handler.HandleAsync(pedido, ct);
}
catch (DbUpdateConcurrencyException ex)
{
_log.LogWarning(ex, "Conflito de concorrencia em {PedidoId}", pedido.Id);
}
}
}
// ValueTask evita a alocacao quando o caminho quente acerta o cache.
public ValueTask<Cliente?> BuscarAsync(int id) =>
_cache.TryGetValue(id, out var encontrado)
? ValueTask.FromResult<Cliente?>(encontrado)
: new ValueTask<Cliente?>(CarregarDoBancoAsync(id));
}
public sealed class ProcessadorDePedidos : BackgroundService
{
private readonly IServiceScopeFactory _escopos;
private readonly ILogger<ProcessadorDePedidos> _log;
protected override async Task ExecuteAsync(CancellationToken ct)
{
await using var escopo = _escopos.CreateAsyncScope();
var db = escopo.ServiceProvider.GetRequiredService<AppDbContext>();
await foreach (var pedido in db.Pedidos
.AsNoTracking()
.Where(p => p.Status == StatusPedido.Pendente)
.OrderBy(p => p.CriadoEm)
.AsAsyncEnumerable()
.WithCancellation(ct))
{
try
{
await _handler.HandleAsync(pedido, ct);
}
catch (DbUpdateConcurrencyException ex)
{
_log.LogWarning(ex, "Conflito de concorrencia em {PedidoId}", pedido.Id);
}
}
}
// ValueTask evita a alocacao quando o caminho quente acerta o cache.
public ValueTask<Cliente?> BuscarAsync(int id) =>
_cache.TryGetValue(id, out var encontrado)
? ValueTask.FromResult<Cliente?>(encontrado)
: new ValueTask<Cliente?>(CarregarDoBancoAsync(id));
}