2017-05-11 26 views
5

ラムダ式内で非同期式を呼び出すとしますか?非同期式Lambda式のどこで句

return xyz.Where(async x=> await AsyncMethodCall(x.val)); 

そして、非同期メソッドが

public async Task<bool> AsyncMethodCall(Data d){...} 

私は上記を行うと、私は

エラー次のエラーを取得するように見える - 私は

例えば下にやって助けてくださいCS4010非同期ラムダ式をデリゲートタイプ 'Func<Data, bool>'に変換できません。非同期式ラムダ式は、、Task またはTask<T>を返します。いずれも'Func<Data, bool>'に変換できません。

あなたは動作しませんやっているヘルプ

+0

ここには*フィルタ*があります。それは*フィルタリングするものだと思っています、ランダムな変更を加えないでください。なぜ非同期メソッドを使用していますか? * Select *ステートメントのように使用していますか? –

+2

@PanagiotisKanavosたとえば、Webサービスを呼び出したり、DBにアクセスしたりすることができます。質問は良いです...あなたはそれをすることはできません。もし可能であっても、それはおそらく良いアイデアではありません。もう一つの問題です... – xanatos

+2

@ xanatosそれは悪い考えです、なぜあなたはそれができないのでしょうか?すなわち、なぜタスクを受け入れる 'Where()'メソッドがないのですか? –

答えて

-2

を事前に感謝します。その理由は、次のエラーメッセージから明らかです。

エラーCS4010非同期ラムダ式を代理人タイプ 'Func'に変換できません。非同期ラムダ式はvoid、Task またはTaskを返しますが、いずれも 'Func'に変換できません。

ラムダ式がTask<bool>になっています。 Where()関数は、関数の代理を必要としています。タスクをboolを取得するために使用できる関数代理人に変換することはできません。物語の終わり。

return xyz.Where(x => AsyncMethodCall(x.val).Result); 

この意志:あなたは本当にこの方法でメソッドを呼び出したい場合は、ラムダが、この場合には、非同期メソッドの呼び出しの結果をブール値を返すことを確認する必要があり

Resultアクセサを呼び出すと、メソッド呼び出しが完了するまでスレッドがブロックされるため、意味のある結果が得られます。

6

非同期シーケンスは、実際にはのコードをとする必要があるため、扱いにくいです。あなたは、同時にすべての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の順番で完了するかを決める必要があります。

関連する問題