You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:23:06