在返回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
相关产品推荐
相关产品推荐

