Anda memiliki 3 opsi:
- Gunakan metode driver bawaan (mis.
ForEachAsync,ToListAsync). - Pada C# 8.0 dan di atasnya, Anda dapat mengonversi
IAsyncCursormenjadiIAsyncEnumerabledan gunakanawait foreachatau operator LINQ asinkron mana pun. - Ulangi
IAsyncCursor.
Metode Driver Bawaan
Driver memiliki beberapa metode ekstensi seperti LINQ untuk IAsyncCursor , seperti AnyAsync , ToListAsync , dll. Untuk iterasi ada ForEachAsync :
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
Mengonversi ke IAsyncEnumerable
Pada C# 8.0 dan di atasnya harus lebih baik untuk mengulangi dengan await foreach (dan gunakan async LINQ). Ini membutuhkan pembungkusan IAsyncCursor dalam IAsyncEnumerable .Anda dapat melakukannya sendiri tetapi karena penting untuk mendapatkan beberapa hal penting dengan benar (seperti pembatalan dan pembuangan), saya telah menerbitkan paket nuget:MongoAsyncEnumerableAdapter
var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
Console.WriteLine(db["name"]);
}
Iterasi khusus
Iterasi tradisional dalam C# dilakukan dengan IEnumerable dan foreach . foreach adalah gula sintaksis kompiler. Ini sebenarnya panggilan ke GetEnumerator , sebuah using lingkup dan while lingkaran:
using (var enumerator = enumerable.GetEnumerator())
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
// use current.
}
}
IAsyncCursor setara dengan IEnumerator (hasil dari IEnumerable.GetEnumerator ) saat IAsyncCursorSource adalah untuk IEnumerable . Perbedaannya adalah bahwa ini mendukung async (dan dapatkan batch setiap iterasi dan bukan hanya satu item). Jadi Anda dapat mengimplementasikan seluruh using , while ulangi sendiri:
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}