Máte 3 možnosti:
- Použijte vestavěnou metodu ovladače (např.
ForEachAsync,ToListAsync). - V jazyce C# 8.0 a vyšším můžete převést
IAsyncCursordoIAsyncEnumerablea použijteawait foreachnebo jakýkoli asynchronní operátor LINQ. - Opakujte přes
IAsyncCursor.
Metody vestavěných ovladačů
Ovladač má některé metody rozšíření podobné LINQ pro IAsyncCursor , například AnyAsync , ToListAsync , atd. Pro iteraci má ForEachAsync :
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
Převod na IAsyncEnumerable
Na C# 8.0 a vyšších musí být hezčí iterovat s await foreach (a použijte asynchronní LINQ). To vyžaduje zabalení IAsyncCursor v IAsyncEnumerable .Můžete to udělat sami, ale protože je důležité uvést některé důležité věci do pořádku (jako je zrušení a likvidace), zveřejnil jsem balíček nuget:MongoAsyncEnumerableAdapter
var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
Console.WriteLine(db["name"]);
}
Vlastní iterace
Tradiční iterace v C# se provádí pomocí IEnumerable a foreach . foreach je syntaktický cukr kompilátoru. Je to vlastně volání GetEnumerator , using rozsah a while smyčka:
using (var enumerator = enumerable.GetEnumerator())
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
// use current.
}
}
IAsyncCursor je ekvivalentní IEnumerator (výsledek IEnumerable.GetEnumerator ), zatímco IAsyncCursorSource je IEnumerable . Rozdíl je v tom, že tyto podporují async (a získat dávku každé iterace a ne pouze jednu položku). Takže můžete implementovat celý using , while smyčka věc sami:
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}