我有一个ASP.NET核心应用程序,我在我的控制器和实体框架之间使用服务层。
目前我的服务是同步的,但我想让它们异步。
这是一个控制器示例:
pymc
这是我服务的一个例子:
public async Task<IActionResult> Search(BusinessesSearchModel model)
{
var resultModel = await _businessService.Search(model);
return Ok(resultModel);
}
这不起作用。 Visual Studio告诉我:
这种异步方法缺乏等待&#39;运营商并将同步运行
我应该在哪里添加public interface IBusinessesService
{
Task<BusinessResultListModel> Search(BusinessesSearchModel model);
}
public class BusinessesService : IBusinessesService
{
public async Task<BusinessResultListModel> Search(BusinessesSearchModel model)
{
var queryResult = (from b in MyDBContext.Businesses
where b.Name.Contains(model.Name)
&& b.Phone.Contains(model.Phone)
select new BusinessesListModel
{
ID = b.ID,
Name = b.Name,
Phone = b.Phone
}
).ToList();
var resultModel = new BusinessResultListModel();
resultModel.data = queryResult;
resultModel.othervalue = "other value";
return resultModel;
}
}
才能使此异步?
答案 0 :(得分:4)
您的代码不是异步执行任何操作。要使用await/async
API,您需要在自己的方法中调用异步方法(除非您想自己实现异步逻辑)。
在您的情况下,如果您正在使用Entity Framework,则可以使用它的异步方法进行查询:
public class BusinessesService : IBusinessesService
{
public async Task<BusinessResultListModel> Search(BusinessesSearchModel model)
{
var queryResult = await _context.YourEntity.Where(x => x.SomeProperty == model.Query).ToListAsync(); //<--- This is your async call, awaiting the ToListAsync() method
var resultModel = new BusinessResultListModel();
resultModel.data = queryResult;
resultModel.othervalue = "other value";
return resultModel;
}
}
EntityFramework中的其他异步方法有FirstOrDefaultAsync()
,SingleOrDefaultAsync()
,SaveChangesAsync()
等等
答案 1 :(得分:1)
你错过了linq中的异步。
例如:
public async Task<IEnumerable<SchedulerJob>> GetAllByIdsAsync(IEnumerable<int> ids, CancellationToken cancellationToken = default(CancellationToken))
{
return await Context.SchedulerJobs
.Include(s => s.Program)
.Where(job => ids.Contains(job.Id))
.ToListAsync(cancellationToken);
}
ToListAsync(cancellationToken);
与await
结合使用,您就可以开始了!
我看到你编辑了这个页面:
你需要这样做:
public async Task<BusinessResultListModel> Search(BusinessesSearchModel model)
{
//something like:
var queryResult = await (from b in MyDBContext.Businesses
where b.Name.Contains(model.Name)
&& b.Phone.Contains(model.Phone)
select new BusinessesListModel
{
ID = b.ID,
Name = b.Name,
Phone = b.Phone
}
).ToListAsync();
var resultModel = new BusinessResultListModel();
resultModel.data = queryResult;
resultModel.othervalue = "other value";
return resultModel;
}