ASP.NET核心:使服务异步

时间:2017-01-18 12:38:28

标签: c# asp.net asynchronous asp.net-core asp.net-core-mvc

我有一个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; } } 才能使此异步?

2 个答案:

答案 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;
}