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
IAsyncCursorkonvertieren in einIAsyncEnumerableund verwenden Sieawait foreachoder 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
}
}
}