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
IAsyncCursor
doIAsyncEnumerable
a použijteawait foreach
nebo 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
}
}
}