आपके पास 3 विकल्प हैं:
- अंतर्निहित ड्राइवर विधि का उपयोग करें (उदा.
ForEachAsync,ToListAsync)। - C# 8.0 और इसके बाद के संस्करण पर आप
IAsyncCursor. को रूपांतरित कर सकते हैं एकIAsyncEnumerable. में औरawait foreach. का उपयोग करें या कोई एसिंक्स LINQ ऑपरेटर। IAsyncCursorपर पुनरावृति करें ।
अंतर्निहित चालक तरीके
ड्राइवर के पास IAsyncCursor . के लिए LINQ जैसी कुछ एक्सटेंशन विधियां हैं , जैसे AnyAsync , ToListAsync , आदि। पुनरावृत्ति के लिए इसमें ForEachAsync . है :
var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
Console.WriteLine(db["name"]);
}
IAsyncEnumerable में कनवर्ट किया जा रहा है
C# 8.0 और इसके बाद के संस्करण पर await foreach . के साथ पुनरावृति करना बेहतर होगा (और async LINQ का उपयोग करें)। इसके लिए IAsyncCursor . को लपेटना आवश्यक है एक IAsyncEnumerable . में .आप इसे स्वयं कर सकते हैं लेकिन चूंकि कुछ महत्वपूर्ण चीजों को ठीक करना महत्वपूर्ण है (जैसे रद्दीकरण और निपटान) मैंने एक nuget पैकेज प्रकाशित किया है:MongoAsyncEnumerableAdapter
var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
Console.WriteLine(db["name"]);
}
कस्टम पुनरावृत्ति
C# में पारंपरिक पुनरावृत्ति IEnumerable . के साथ की जाती है और foreach . foreach संकलक की वाक्यात्मक चीनी है। यह वास्तव में GetEnumerator के लिए एक कॉल है , एक using दायरा और एक while लूप:
using (var enumerator = enumerable.GetEnumerator())
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
// use current.
}
}
IAsyncCursor IEnumerator . के बराबर है (IEnumerable.GetEnumerator . का परिणाम ) जबकि IAsyncCursorSource IEnumerable . के लिए है . अंतर यह है कि ये async . को सपोर्ट करते हैं (और प्रत्येक पुनरावृत्ति बैच प्राप्त करें, न कि केवल एक आइटम)। तो आप संपूर्ण using को लागू कर सकते हैं , while लूप चीज़ स्वयं:
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}