У меня есть код, который передает данные из SQL и записывает их в другое хранилище. Код примерно такой:
using (var cmd = new SqlCommand("select * from MyTable", connection))
{
using (var reader = await cmd.ExecuteReaderAsync())
{
var list = new List<MyData>();
while (await reader.ReadAsync())
{
var row = GetRow(reader);
list.Add(row);
if (list.Count == BatchSize)
{
await WriteDataAsync(list);
list.Clear();
}
}
if (list.Count > 0)
{
await WriteDataAsync(list);
}
}
}
Вместо этого я хотел бы использовать реактивные расширения для этой цели. В идеале код должен выглядеть так:
await StreamDataFromSql()
.Buffer(BatchSize)
.ForEachAsync(async batch => await WriteDataAsync(batch));
Однако похоже, что метод расширения ForEachAsync принимает только синхронные действия. Можно ли написать расширение, которое будет принимать асинхронное действие?