您只能使用await
里面一个async
方法/委托。在这种情况下,您必须将该 lambda 表达式标记为async
.
但是等等,还有更多……
Select
是从预async
时代,所以它不处理async
lambdas(在你的情况下它会返回IEnumerable<Task<SomeViewModel>>
代替IEnumerable<SomeViewModel>
这才是你真正需要的)。
但是,您可以自己添加该功能(最好作为扩展方法),但您需要考虑是否希望await
每一项,然后再继续下一项(按顺序)或await
最后将所有项目放在一起(同时)。
顺序async
static async Task<TResult[]> SelectAsync<TItem, TResult>(this IEnumerable<TItem> enumerable, Func<TItem, Task<TResult>> selector)
{
var results = new List<TResult>();
foreach (var item in enumerable)
{
results.Add(await selector(item));
}
return results.ToArray();
}
同时async
static Task<TResult[]> SelectAsync<TItem, TResult>(this IEnumerable<TItem> enumerable, Func<TItem, Task<TResult>> selector)
{
return Task.WhenAll(enumerable.Select(selector));
}
Usage
public Task<SomeViewModel[]> SampleFunction()
{
return service.GetData().SelectAsync(async x => new SomeViewModel
{
Id = x.Id,
DateCreated = x.DateCreated,
Data = await service.GetSomeDataById(x.Id)
}
}