質問: 私は、リストを返すコアインタフェースでメソッドを定義する必要があります。私のプロジェクトはasync / awaitの使用に大きく依存しているので、コアリファレンス/インターフェイスを可能な限り非同期として定義する必要があります。私は自分のデータアクセス層にEF7を使用しています。私は現在どこでも`IAsyncEnumerable`使用しています。 現在、 `IAsyncEnumerable`を使用し続けるか、 `Task>`を使用して元に戻すかを決定してい`Task>` 。この時点で`IAsyncEnumerable`は有望なようです。 EF7もそれを使用しています。問題は、私は知らないし、それを使う方法を理解できないということです。 **Ix.Netの**使い方を誰にでも知らせるウェブサイトはほとんどありません。 `IEnumerable`オブジェクトで使用できる`ToAsyncEnumerable`拡張がありますが、これは非同期的に何もしません(またはそれは何ですか?)。別の欠点は、以下のシグネチャが与えられたことです。 ``` IAsyncEnumerable GetPersons(); ``` これはTaskを返す関数ではないため、関数ブロック内でasync / awaitを使用することはできません。 一方、私の腸は私が`Task>`を使うことに固執すべきだということを私に伝えてい`Task>` 。これにはもちろん問題もあります。 EFには、この型を返す拡張メソッドはありません。それは`ToArrayAsync`と`ToListAsync`拡張メソッドを持っていますが、 `Task`は共変ではないので、メソッド内でwaitを呼び出す必要があります。これは、単に`Task`オブジェクトを返すだけで回避できる余分な*操作*を作成するため、問題になる可能性があります。 私の質問は:私は`IAsyncEnumerable` (推奨)を使用し続けるべきですか? `Task>` ( `IAsyncEnumerable`ない)にすべてを戻す必要がありますか?私は他の提案にもオープンしています。
回答: 私は`IAsyncEnumerable`と一緒に行くだろう。非同期と遅延の両方の操作を維持することができます。 それがなければ、すべての結果をメモリにロードしていることを意味する`Task`を返す必要があります。これは、多くの場合、必要以上にメモリを照会して保持することを意味します。 古典的なケースでは、ユーザーが`Any` onを呼び出すというクエリがあります。それが`Task`場合は、すべての結果をメモリに最初にロードし、 `IAsyncEnumerable` 1つの結果をロードすれば十分です。 また、 `Task`では、メモリ内の結果セット全体を同時に保持する必要がありますが、 `IAsyncEnumerable`を使用すると、一度にいくつかの結果を「ストリーム」できます。 また、それが生態系の方向性です。これは、今週だけStephen Toubが提案した新しいライブラリによって反応的な拡張によって追加されたもので、ネイティブのC#の次のバージョンでおそらくサポートされる予定です。