Masz 3 opcje:
- Użyj wbudowanej metody sterownika (np.
ForEachAsync
,ToListAsync
). - W C# 8.0 i nowszych możesz przekonwertować
IAsyncCursor
wIAsyncEnumerable
i użyjawait foreach
lub dowolny operator asynchronicznego LINQ. - Iteruj po
IAsyncCursor
.
Wbudowane metody sterowników
Sterownik ma kilka metod rozszerzenia podobnych do LINQ dla IAsyncCursor
, np. AnyAsync
, ToListAsync
, itp. Dla iteracji ma ForEachAsync
:
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
Konwertowanie na IAsyncEnumerable
W C# 8.0 i nowszych musi ładniej iterować z await foreach
(i użyj asynchronicznego LINQ). Wymaga to zapakowania IAsyncCursor
w IAsyncEnumerable
.Możesz to zrobić sam, ale ponieważ ważne jest, aby niektóre krytyczne rzeczy były prawidłowe (takie jak anulowanie i usuwanie), opublikowałem pakiet nuget:MongoAsyncEnumerableAdapter
var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
Console.WriteLine(db["name"]);
}
Niestandardowa iteracja
Tradycyjna iteracja w C# odbywa się za pomocą IEnumerable
i foreach
. foreach
jest cukierkiem składniowym kompilatora. W rzeczywistości jest to wywołanie GetEnumerator
, using
zakres i while
pętla:
using (var enumerator = enumerable.GetEnumerator())
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
// use current.
}
}
IAsyncCursor
jest odpowiednikiem IEnumerator
(wynik IEnumerable.GetEnumerator
) podczas gdy IAsyncCursorSource
jest IEnumerable
. Różnica polega na tym, że obsługują one async
(i otrzymuj partię w każdej iteracji, a nie tylko pojedynczy element). Możesz więc zaimplementować całe using
, while
zapętl coś sam:
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}