आपके पास 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
}
}
}