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.

questionAnswers(5)

yourAnswerToTheQuestion