Du har 3 alternativ:
- Använd den inbyggda drivrutinsmetoden (t.ex.
ForEachAsync,ToListAsync). - På C# 8.0 och senare kan du konvertera
IAsyncCursortill enIAsyncEnumerableoch användawait foreacheller någon asynkron LINQ-operatör. - Iterera över
IAsyncCursor.
Inbyggda drivrutinsmetoder
Drivrutinen har några LINQ-liknande tilläggsmetoder för IAsyncCursor , som AnyAsync , ToListAsync , etc. För iteration har den ForEachAsync :
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
Konverterar till IAsyncEnumerable
På C# 8.0 och senare är det mycket trevligare att iterera med await foreach (och använd async LINQ). Detta kräver att du lindar IAsyncCursor i en IAsyncEnumerable .Du kan göra det själv men eftersom det är viktigt att få några viktiga saker rätt (som avbokning och kassering) har jag publicerat ett nuget-paket:MongoAsyncEnumerableAdapter
var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
Console.WriteLine(db["name"]);
}
Anpassad iteration
Traditionell iteration i C# görs med IEnumerable och foreach . foreach är kompilatorns syntaktiska socker. Det är faktiskt ett anrop till GetEnumerator , en using scope och en while loop:
using (var enumerator = enumerable.GetEnumerator())
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
// use current.
}
}
IAsyncCursor motsvarar IEnumerator (resultatet av IEnumerable.GetEnumerator ) medan IAsyncCursorSource är att IEnumerable . Skillnaden är att dessa stöder async (och få en batch varje iteration och inte bara ett enda föremål). Så du kan implementera hela using , while loop sak själv:
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}