3つのオプションがあります:
- 組み込みのドライバーメソッドを使用します(例:
ForEachAsync、ToListAsync。 - C#8.0以降では、
IAsyncCursorを変換できます。IAsyncEnumerableにawait foreachを使用します または任意の非同期LINQ演算子。 -
IAsyncCursorを繰り返し処理します 。
組み込みのドライバメソッド
ドライバーには、IAsyncCursor用のLINQのような拡張メソッドがいくつかあります。 、AnyAsyncのように 、ToListAsync など。反復には、ForEachAsyncがあります。 :
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
IAsyncEnumerableへの変換
C#8.0以降では、await foreachで反復する方が適切なはずです。 (そして非同期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の結果 )while 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
}
}
}