Je hebt 3 opties:
- Gebruik de ingebouwde drivermethode (bijv.
ForEachAsync
,ToListAsync
). - Op C# 8.0 en hoger kun je de
IAsyncCursor
. converteren in eenIAsyncEnumerable
en gebruikawait foreach
of een asynchrone LINQ-operator. - Herhaal over de
IAsyncCursor
.
Ingebouwde stuurprogrammamethoden
Het stuurprogramma heeft enkele LINQ-achtige extensiemethoden voor IAsyncCursor
, zoals AnyAsync
, ToListAsync
, etc. Voor iteratie heeft het ForEachAsync
:
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
Converteren naar IAsyncEnumerable
Op C# 8.0 en hoger moet het leuker zijn om te herhalen met await foreach
(en gebruik asynchrone LINQ). Dit vereist het verpakken van de IAsyncCursor
in een IAsyncEnumerable
.Je kunt het zelf doen, maar omdat het belangrijk is om een aantal cruciale dingen goed te krijgen (zoals annulering en verwijdering), heb ik een nuget-pakket gepubliceerd:MongoAsyncEnumerableAdapter
var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
Console.WriteLine(db["name"]);
}
Aangepaste iteratie
Traditionele iteratie in C# wordt gedaan met IEnumerable
en foreach
. foreach
is de syntactische suiker van de compiler. Het is eigenlijk een oproep naar GetEnumerator
, een using
bereik en een while
lus:
using (var enumerator = enumerable.GetEnumerator())
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
// use current.
}
}
IAsyncCursor
is gelijk aan IEnumerator
(het resultaat van IEnumerable.GetEnumerator
) terwijl IAsyncCursorSource
is naar IEnumerable
. Het verschil is dat deze async
. ondersteunen (en ontvang elke iteratie een batch en niet slechts een enkel item). U kunt dus de hele using
, while
loop ding zelf:
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}