Sie haben 3 Möglichkeiten:
- Verwenden Sie die eingebaute Treibermethode (z. B.
ForEachAsync
,ToListAsync
). - Auf C# 8.0 und höher können Sie den
IAsyncCursor
konvertieren in einIAsyncEnumerable
und verwenden Sieawait foreach
oder einen beliebigen asynchronen LINQ-Operator. - Iterieren Sie über den
IAsyncCursor
.
Integrierte Treibermethoden
Der Treiber verfügt über einige LINQ-ähnliche Erweiterungsmethoden für IAsyncCursor
, wie AnyAsync
, ToListAsync
usw. Für die Iteration gibt es ForEachAsync
:
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
Konvertieren in IAsyncEnumerable
Auf C# 8.0 und höher ist es sicherlich angenehmer, mit await foreach
zu iterieren (und asynchrones LINQ verwenden). Dazu muss der IAsyncCursor
umschlossen werden in einem IAsyncEnumerable
.Sie können es selbst tun, aber da es wichtig ist, einige kritische Dinge richtig zu machen (wie Stornierung und Entsorgung), habe ich ein Nuget-Paket veröffentlicht:MongoAsyncEnumerableAdapter
var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
Console.WriteLine(db["name"]);
}
Benutzerdefinierte Iteration
Traditionelle Iteration in C# erfolgt mit IEnumerable
und foreach
. foreach
ist der syntaktische Zucker des Compilers. Es ist eigentlich ein Aufruf von GetEnumerator
, ein using
Geltungsbereich und ein while
Schleife:
using (var enumerator = enumerable.GetEnumerator())
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
// use current.
}
}
IAsyncCursor
entspricht IEnumerator
(das Ergebnis von IEnumerable.GetEnumerator
) während IAsyncCursorSource
ist zu IEnumerable
. Der Unterschied besteht darin, dass diese async
unterstützen (und erhalten Sie bei jeder Iteration einen Stapel und nicht nur ein einzelnes Element). So können Sie das ganze using
implementieren , while
Loop-Ding selbst:
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}