Mam następujący kod, przeliczenia pozycji pomiędzy rodzajami R
i L
stosując metodę transmisji asynchronicznej:Wywołanie metody asynchronicznej w IEnumerable.Select
class MyClass<R,L> {
public async Task<bool> MyMethodAsync(List<R> remoteItems) {
...
List<L> mappedItems = new List<L>();
foreach (var remoteItem in remoteItems)
{
mappedItems.Add(await MapToLocalObject(remoteItem));
}
//Do stuff with mapped items
...
}
private async Task<L> MapToLocalObject(R remoteObject);
}
Czy to możliwe, aby napisać używając połączenia IEnumerable.Select (lub podobny), aby zmniejszyć linie kodu? Próbowałem to:
class MyClass<R,L> {
public async Task<bool> MyMethodAsync(List<R> remoteItems) {
...
List<L> mappedItems = remoteItems.Select<R, L>(async r => await MapToLocalObject(r)).ToList<L>();
//Do stuff with mapped items
...
}
}
ale pojawia się błąd:
"Cannot convert async lambda expression to delegate type
'System.Func<R,int,L>'
. An async lambda expression may returnvoid
,Task
orTask<T>
, none of which are convertible to'System.Func<R,int,L>'
."
Wierzę, że jestem brakuje czegoś o async/czekają na słowa kluczowe, ale nie mogę dowiedzieć się, co. Czy jakikolwiek organ wie, w jaki sposób mogę zmodyfikować mój kod, aby działał?
powinny działać, spróbuj nie określając parametrów typu? –
@ofstream: Nie, to nie powinno działać. Komunikat o błędzie jest dość specyficzny. –
Jeśli nie określę parametrów typu ('remoteItems.Select (async r => czeka na MapToLocalObject (r)). ToList()') Otrzymuję 'List >>', który nie jest tym, czego chcę. –
PKeno