非同期シーケンスは、実際にはのコードをとする必要があるため、扱いにくいです。あなたは、同時にすべてのAsyncMethodCall
呼び出しを実行して、収集し、(結果を返すことができ、
var result = new List<T>();
foreach (var d in xyz)
if (await AsyncMethodCall(d.val))
result.Add(d);
return result;
をまたは:
たとえば、順次AsyncMethodCall
呼び出しを実行して、すべての結果を返すようにしたいこと再び、すべてを一度に):
var tasks = xyz.Select(async d => new { d, filter = await AsyncMethodCall(d.val) });
var results = await Task.WhenAll(tasks);
return results.Where(x => x.filter).Select(x => x.d);
それとも、あなたが順番にすべてのAsyncMethodCall
呼び出しを実行し、一度に結果の1を作り出すことができます。この方法はIEnumerable<T>
と互換性がありません(呼び出しを非同期にしたい場合)。配列の列挙中にAsyncMethodCall
が非同期に呼び出されるシーケンスを作成する場合は、IAsyncEnumerable<T>
に変更する必要があります。コンシューマーによってが開始されたのシーケンスを生成し、それからそれ自身の結果を生成する場合は、IObservable<T>
に変更する必要があります。
または、すべてのAsyncMethodCall
コールを同時に実行して、一度に1つずつ結果を生成することができます。これもIEnumerable<T>
と互換性がありません。 IObservable<T>
に変更する必要があります。また、元の注文を維持するか、AsyncMethodCall
の順番で完了するかを決める必要があります。
ここには*フィルタ*があります。それは*フィルタリングするものだと思っています、ランダムな変更を加えないでください。なぜ非同期メソッドを使用していますか? * Select *ステートメントのように使用していますか? –
@PanagiotisKanavosたとえば、Webサービスを呼び出したり、DBにアクセスしたりすることができます。質問は良いです...あなたはそれをすることはできません。もし可能であっても、それはおそらく良いアイデアではありません。もう一つの問題です... – xanatos
@ xanatosそれは悪い考えです、なぜあなたはそれができないのでしょうか?すなわち、なぜタスクを受け入れる 'Where()'メソッドがないのですか? –