Vous avez 3 options :
- Utilisez la méthode du pilote intégré (par exemple,
ForEachAsync,ToListAsync). - Sur C# 8.0 et supérieur, vous pouvez convertir le
IAsyncCursordans unIAsyncEnumerableet utilisezawait foreachou tout opérateur LINQ asynchrone. - Itérer sur le
IAsyncCursor.
Méthodes de pilote intégrées
Le pilote a des méthodes d'extension de type LINQ pour IAsyncCursor , comme AnyAsync , ToListAsync , etc. Pour l'itération, il a ForEachAsync :
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
Conversion en IAsyncEnumerable
Sur C # 8.0 et supérieur, il est plus agréable d'itérer avec await foreach (et utilisez LINQ asynchrone). Cela nécessite d'encapsuler le IAsyncCursor dans un IAsyncEnumerable .Vous pouvez le faire vous-même, mais comme il est important de bien faire certaines choses critiques (comme l'annulation et l'élimination), j'ai publié un package nuget :MongoAsyncEnumerableAdapter
var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
Console.WriteLine(db["name"]);
}
Itération personnalisée
L'itération traditionnelle en C# se fait avec IEnumerable et foreach . foreach est le sucre syntaxique du compilateur. C'est en fait un appel à GetEnumerator , un using portée et un while boucle :
using (var enumerator = enumerable.GetEnumerator())
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
// use current.
}
}
IAsyncCursor est équivalent à IEnumerator (le résultat de IEnumerable.GetEnumerator ) tandis que IAsyncCursorSource est à IEnumerable . La différence est que ceux-ci prennent en charge async (et obtenez un lot à chaque itération et pas seulement un seul élément). Ainsi, vous pouvez implémenter l'ensemble using , while bouclez vous-même :
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}