Assíncrona com enormes fluxos de dados
Usamos IEnumerables para retornar enormes conjuntos de dados do banco de dados:
public IEnumerable<Data> Read(...)
{
using(var connection = new SqlConnection(...))
{
// ...
while(reader.Read())
{
// ...
yield return item;
}
}
}
Agora, queremos usar métodos assíncronos para fazer o mesmo. No entanto, não há IEnumerables para assíncrono, portanto, precisamos coletar dados em uma lista até que todo o conjunto de dados seja carregado:
public async Task<List<Data>> ReadAsync(...)
{
var result = new List<Data>();
using(var connection = new SqlConnection(...))
{
// ...
while(await reader.ReadAsync().ConfigureAwait(false))
{
// ...
result.Add(item);
}
}
return result;
}
Isso consumirá uma quantidade enorme de recursos no servidor, porque todos os dados devem estar na lista antes do retorno. Qual é a melhor e mais fácil de usar alternativa assíncrona para IEnumerables trabalhar com grandes fluxos de dados? Gostaria de evitar o armazenamento de todos os dados na memória durante o processamento.