如何从List<Task<Model>>获取List<Model>?异步代码列表生成问题求助
解决List<Task>转List的问题
嗨,我明白你遇到的麻烦了——因为在Select里用了async lambda,所以每个元素都会返回一个Task<CardDataModel>,最终得到的自然是List<Task<CardDataModel>>而不是实体列表。别担心,只要用Task.WhenAll就能轻松搞定!
问题根源
当你在Select中使用async匿名方法时,这个方法的返回值是Task<CardDataModel>,而不是直接的CardDataModel。所以ToList()之后,就变成了一堆待完成的任务列表,而不是你想要的实体集合。
解决方案
我们需要先收集所有的异步任务,然后用Task.WhenAll等待所有任务完成,它会返回一个包含所有结果的数组,最后转成List<CardDataModel>就行。
修改后的完整代码如下:
public async void OnNavigatedTo(NavigationParameters parameters) { var result = await GetMatches(); // 先收集所有异步任务 var cardTasks = result.OrderByDescending(p => p.CreatedAt) .Select(async p => new CardDataModel() { HeadTitle = await generateHeadTitle(p), HeadLines = $"{p.Sport} - {p.PlayersNeeded} players needed @{p.Location}", HeadLinesDesc = p.Comment, ProfileImage = "Person_7.jpg" }) .ToList(); // 等待所有任务完成,得到CardDataModel数组 var cardDataModels = await Task.WhenAll(cardTasks); // 转成List赋值给CardList CardList = cardDataModels.ToList(); }
额外小提示
另外,尽量避免使用async void(除非是事件处理这类必须用的场景),如果你的OnNavigatedTo方法允许返回Task,改成async Task会更安全,能避免一些异步操作中的异常捕获问题。
内容的提问来源于stack exchange,提问作者upTheIrons
相关产品推荐
相关产品推荐

