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

在返回Task<T>的方法中如何正确使用await等待任务?

问题核心原因

你对C# async/await语法的返回值规则存在误解:标记了async修饰符的方法完全支持返回Task<T>类型,这是异步带返回值方法的标准定义方式,你遇到的报错都是用法不匹配导致的。

正确实现代码

// 方法签名添加async修饰符,返回值保持Task<List<HWElDocument>>即可,属于合法写法
public async Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)
{
    // 获取所有条目
    if (ProjectID == null)
    {
        // await异步操作的结果,编译器会自动封装为Task返回
        return await database.Table<HWElDocument>().ToListAsync();
    }
    // 获取满足条件的所有条目
    else
    {
        List<HWDocuProj> projList = await database.Table<HWDocuProj>().Where(item => item.ProjID == ProjectID).ToListAsync();
        return await database.Table<HWElDocument>().Where(item => projList.Exists(p => p.ProjID == item.ID)).ToListAsync();
    }
}

报错原因说明

  • 要求加async的报错:await关键字只能在标记了async修饰符的方法内部使用,给方法加上async修饰符即可解决
  • 以为async不能返回Task的误解:async方法的返回值规则为:无返回值对应Task,带返回值对应Task<T>,不需要手动封装Task,只需要返回T类型的结果或者awaitTask<T>类型的异步操作即可。你之前尝试把返回值改成List<HWElDocument>才会触发类型不匹配报错,因为ToListAsync()返回的是Task<List<HWElDocument>>,和你设置的List<HWElDocument>返回类型不匹配。

可选优化方案

如果所用的ORM支持Linq联合查询,可以把两次查询合并为一次,提升性能:

public async Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)
{
    if (ProjectID == null)
    {
        return await database.Table<HWElDocument>().ToListAsync();
    }
    return await (from doc in database.Table<HWElDocument>()
                  join proj in database.Table<HWDocuProj>() on doc.ID equals proj.ProjID
                  where proj.ProjID == ProjectID
                  select doc).ToListAsync();
}

内容的提问来源于stack exchange,提问作者Belight

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:15:01