Ответ 1
Короткий ответ: используйте метод расширения ForEachAsync
:
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
Длинный ответ: Традиционная итерация в С# выполняется с помощью IEnumerable
и foreach
. foreach
- это синтаксический сахар компилятора. Это фактически вызов области GetEnumerator
, a using
и цикла while
. Но это не поддерживает асинхронные операции:
using (var enumerator = enumerable.GetEnumerator())
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
// use current.
}
}
IAsyncCursor
эквивалентен IEnumerator
(результат IEnumerable.GetEnumerator
), а IAsyncCursorSource
равен IEnumerable
. Разница в том, что они поддерживают async
(и получают партию каждой итерации, а не только один элемент). Вы не можете использовать foreach
как он создан для IEnumerable
, но вы можете реализовать целую цепочку using
, while
:
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}
Однако, что много шаблонов, поэтому драйвер добавляет методы расширения для IAsyncCursor
как ForEachAsync
, ToListAsync
и так далее.
Это относится к большинству распространенных случаев использования, но для других вам по-прежнему необходимо реализовать итерацию самостоятельно.