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
}
}
}