¿Cómo se usa un IAsyncCursor para la iteración con el controlador mongodb c#?
.net async-await (1)
Respuesta corta: use el método de extensión ForEachAsync
:
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
Respuesta larga: la iteración tradicional en C # se realiza con IEnumerable
y foreach
. foreach
es el azúcar sintáctico del compilador. En realidad, es una llamada a GetEnumerator
, un ámbito de using
y un bucle while. Pero eso no soporta operaciones asíncronas:
using (var enumerator = enumerable.GetEnumerator())
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
// use current.
}
}
IAsyncCursor
es equivalente a IEnumerator
(el resultado de IEnumerable.GetEnumerator
), mientras que IAsyncCursorSource
es a IEnumerable
. La diferencia es que estos admiten async
(y obtienen un lote en cada iteración y no solo un elemento). No puedes usar foreach
como está construido para IEnumerable
pero puedes implementar todo using
, while
loop thing:
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}
Sin embargo, eso es un montón de repetitivo, por lo que el controlador agrega métodos de extensión para IAsyncCursor
como ForEachAsync
, ToListAsync
, etc.
Eso cubre la mayoría de los casos de uso comunes, pero para otros, aún necesita implementar la iteración usted mismo.
Estoy intentando obtener una lista de todas las bases de datos en mi servidor y finalmente imprimirlas (es decir, usar sus nombres como string
). Con la versión anterior del controlador c # podría llamar a Server.GetDatabases()
, pero se ha reemplazado con ListDatabasesAsync()
.
El valor de retorno es un IAsyncCursor<>
y no estoy seguro de qué hacer con él. ¿Cómo se recorre la lista de bases de datos (o algo) con un cursor de este tipo?