Du har 3 alternativ:
- Använd den inbyggda drivrutinsmetoden (t.ex.
ForEachAsync
,ToListAsync
). - På C# 8.0 och senare kan du konvertera
IAsyncCursor
till enIAsyncEnumerable
och användawait foreach
eller 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
}
}
}