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
IAsyncCursor
dans unIAsyncEnumerable
et utilisezawait foreach
ou 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
}
}
}