Anda memiliki 3 opsi:
- Gunakan metode driver bawaan (mis.
ForEachAsync
,ToListAsync
). - Pada C# 8.0 dan di atasnya, Anda dapat mengonversi
IAsyncCursor
menjadiIAsyncEnumerable
dan gunakanawait foreach
atau 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
}
}
}