Du har 3 muligheder:
- Brug den indbyggede drivermetode (f.eks.
ForEachAsync
,ToListAsync
). - På C# 8.0 og nyere kan du konvertere
IAsyncCursor
ind i enIAsyncEnumerable
og brugawait foreach
eller enhver asynkron LINQ-operatør. - Gentag over
IAsyncCursor
.
Indbyggede drivermetoder
Driveren har nogle LINQ-lignende udvidelsesmetoder til IAsyncCursor
, som AnyAsync
, ToListAsync
, osv. Til iteration har den ForEachAsync
:
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
Konverterer til IAsyncEnumerable
På C# 8.0 og nyere er det meget bedre at iterere med await foreach
(og brug async LINQ). Dette kræver indpakning af IAsyncCursor
i en IAsyncEnumerable
.Du kan gøre det selv, men da det er vigtigt at få nogle vigtige ting rigtigt (såsom annullering og bortskaffelse), har jeg udgivet en nuget-pakke:MongoAsyncEnumerableAdapter
var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
Console.WriteLine(db["name"]);
}
Tilpasset iteration
Traditionel iteration i C# udføres med IEnumerable
og foreach
. foreach
er compilerens syntaktiske sukker. Det er faktisk et opkald til GetEnumerator
, en using
omfang og et while
sløjfe:
using (var enumerator = enumerable.GetEnumerator())
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
// use current.
}
}
IAsyncCursor
svarer til IEnumerator
(resultatet af IEnumerable.GetEnumerator
) mens IAsyncCursorSource
er at IEnumerable
. Forskellen er, at disse understøtter async
(og få en batch hver iteration og ikke kun en enkelt vare). Så du kan implementere hele using
, while
loop ting selv:
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}