どのようにしてオブジェクトのコレクションを非同期で正しく返すのですか?

.net async-await c# entity-framework-core system.reactive

質問

私は、リストを返すコアインタフェースでメソッドを定義する必要があります。私のプロジェクトはasync / awaitの使用に大きく依存しているので、コアリファレンス/インターフェイスを可能な限り非同期として定義する必要があります。私は自分のデータアクセス層にEF7を使用しています。私は現在どこでもIAsyncEnumerable使用しています。

現在、 IAsyncEnumerableを使用し続けるか、 Task<IEnumerable<T>>を使用して元に戻すかを決定していTask<IEnumerable<T>> 。この時点でIAsyncEnumerableは有望なようです。 EF7もそれを使用しています。問題は、私は知らないし、それを使う方法を理解できないということです。 Ix.Netの使い方を誰にでも知らせるウェブサイトはほとんどありません。 IEnumerableオブジェクトで使用できるToAsyncEnumerable拡張がありますが、これは非同期的に何もしません(またはそれは何ですか?)。別の欠点は、以下のシグネチャが与えられたことです。

IAsyncEnumerable GetPersons();

これはTaskを返す関数ではないため、関数ブロック内でasync / awaitを使用することはできません。

一方、私の腸は私がTask<IEnumerable<T>>を使うことに固執すべきだということを私に伝えていTask<IEnumerable<T>> 。これにはもちろん問題もあります。 EFには、この型を返す拡張メソッドはありません。それはToArrayAsyncToListAsync拡張メソッドを持っていますが、 Task<T>は共変ではないので、メソッド内でwaitを呼び出す必要があります。これは、単にTaskオブジェクトを返すだけで回避できる余分な操作を作成するため、問題になる可能性があります。

私の質問は:私はIAsyncEnumerable (推奨)を使用し続けるべきですか? Task<IEnumerable<T>>IAsyncEnumerableない)にすべてを戻す必要がありますか?私は他の提案にもオープンしています。

人気のある回答

私はIAsyncEnumerableと一緒に行くだろう。非同期と遅延の両方の操作を維持することができます。

それがなければ、すべての結果をメモリにロードしていることを意味するTask<IEnumerble>を返す必要があります。これは、多くの場合、必要以上にメモリを照会して保持することを意味します。

古典的なケースでは、ユーザーがAny onを呼び出すというクエリがあります。それがTask<IEnumerable>場合は、すべての結果をメモリに最初にロードし、 IAsyncEnumerable 1つの結果をロードすれば十分です。

また、 Task<IEnumerable>では、メモリ内の結果セット全体を同時に保持する必要がありますが、 IAsyncEnumerableを使用すると、一度にいくつかの結果を「ストリーム」できます。

また、それが生態系の方向性です。これは、今週だけStephen Toubが提案した新しいライブラリによって反応的な拡張によって追加されたもので、ネイティブのC#の次のバージョンでおそらくサポートされる予定です。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ