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
IAsyncCursorthành mộtIAsyncEnumerablevà sử dụngawait foreachhoặ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
}
}
}