Je hebt 3 opties:
- Gebruik de ingebouwde drivermethode (bijv.
ForEachAsync,ToListAsync). - Op C# 8.0 en hoger kun je de
IAsyncCursor. converteren in eenIAsyncEnumerableen gebruikawait foreachof 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
}
}
}