ASP.NET 核心 Web API - 如何解决警告 CS1998 此异步方法缺少"等待"运算符,将同步运行



我正在ASP.NET Core-6 Web API中实现异步编程。

我有这个代码:

public async Task<IQueryable<Score>> GetExamScoreAsync(PagingFilter filter)
{
var examScores = _dbContext.Scores
.Where(m => (bool)m.Approval.IsFirstLevel == false)
.Where(x => string.IsNullOrEmpty(filter.SearchQuery)
|| x.Subject.ToLower().Contains(filter.SearchQuery.ToLower())
|| x.StartDate.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture).Contains(filter.SearchQuery.ToLower())
|| x.EndDate.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture).Contains(filter.SearchQuery.ToLower()))
.OrderByDescending(x => x.CreatedAt);
return examScores;
}

我收到这个警告:

严重性代码描述项目文件行禁止显示状态警告CS1998此异步方法缺少"wait"运算符,将同步运行。考虑使用'await'运算符来等待非阻塞API调用,或使用'await Task.Run(…('来执行CPUBound工作

当我在_dbContent.Scores之前添加wait时,我得到了以下错误:

错误CS1061"IOrderedQueryable"不包含"GetAwaiter"的定义,并且找不到接受"IOrderedQueryable"类型的第一个参数的可访问扩展方法"GetAwaite"(是否缺少using指令或程序集引用?(

我如何解决这个问题并在这里应用异步?

谢谢。

您没有调用返回Task/Task<T>的异步方法,因此没有什么可等待的(也没有合适的返回类型(。根据Artur在评论中的建议更新你的方法,或者再次调用以生成你想要的Task(但你不需要async,结果类型也不会是IQueryable<T>(。一些简化的可能性:

public IQueryable<MyEntity> Get(...)
{
return dbContext.MyEntities
.Where(...);
}
public IAsyncEnumerable<MyEntity> Get(...)
{
return dbContext.MyEntities
.Where(...)
.AsAsyncEnumerable();
}
public Task<MyEntity[]> Get(...)
{
return dbContext.MyEntities
.Where(...)
.ToArrayAsync();
}

如果以后要以相同的方法使用异步操作的结果,则可以使用asyncawait

public async Task<int> GetCount(...)
{
var entities = await dbContext.MyEntities
.Where(...)
.ToArrayAsync();
// obviously not efficient but to demonstrate
// how async/await is used
return entities.Length;
}

最新更新