Bạn có 3 lựa chọn:
- Sử dụng phương pháp trình điều khiển tích hợp sẵn (ví dụ:
ForEachAsync
,ToListAsync
). - Trên C # 8.0 trở lên, bạn có thể chuyển đổi
IAsyncCursor
thành mộtIAsyncEnumerable
và sử dụngawait foreach
hoặc bất kỳ toán tử LINQ không đồng bộ nào. - Lặp lại
IAsyncCursor
.
Phương pháp trình điều khiển tích hợp
Trình điều khiển có một số phương thức mở rộng giống LINQ cho IAsyncCursor
, như AnyAsync
, ToListAsync
, v.v. Để lặp lại, nó có ForEachAsync
:
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
Chuyển đổi thành IAsyncEnumerable
Trên C # 8.0 trở lên, nó phải đẹp hơn khi lặp lại với await foreach
(và sử dụng LINQ không đồng bộ). Điều này yêu cầu gói IAsyncCursor
trong một IAsyncEnumerable
.Bạn có thể tự làm nhưng vì điều quan trọng là phải làm đúng một số việc quan trọng (như hủy và xử lý), tôi đã xuất bản một gói nuget: MongoAsyncEnumerableAdapter
var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
Console.WriteLine(db["name"]);
}
Lặp lại tùy chỉnh
Lặp lại truyền thống trong C # được thực hiện với IEnumerable
và foreach
. foreach
là cú pháp của trình biên dịch. Nó thực sự là một cuộc gọi đến GetEnumerator
, một using
phạm vi và một while
vòng lặp:
using (var enumerator = enumerable.GetEnumerator())
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
// use current.
}
}
IAsyncCursor
tương đương với IEnumerator
(kết quả của IEnumerable.GetEnumerator
) trong khi IAsyncCursorSource
là IEnumerable
. Sự khác biệt là những hỗ trợ này async
(và nhận được một lô mỗi lần lặp lại chứ không chỉ một mục duy nhất). Vì vậy, bạn có thể triển khai toàn bộ using
, while
tự lặp lại điều này:
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}