【问题标题】:ASP.NET Core: Making service asynchronousASP.NET Core:使服务异步
【发布时间】:2017-01-18 12:38:28
【问题描述】:

我有一个 ASP.NET 核心应用程序,我在其中使用我的控制器和实体框架之间的服务层。

目前我的服务是同步的,但我想让它们异步。

这是一个控制器示例:

public async Task<IActionResult> Search(BusinessesSearchModel model)
{
    var resultModel = await _businessService.Search(model);
    return Ok(resultModel);
}

这是我的服务示例:

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

这不起作用。 Visual Studio 告诉我:

此异步方法缺少“等待”运算符,将同步运行

我应该在哪里添加await 以使其异步?

【问题讨论】:

  • var queryResult = "LINQ query here"...你试过什么?
  • 您的问题在这里不清楚。你的查询结果是什么?您使用的是 Linq to Sql 还是 Linq to 对象?后来不支持异步。 linq to sql(即使用实体框架/IQueryable)可以支持
  • 很抱歉。我已经更新了查询部分。我正在使用 EF。

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


【解决方案1】:

您的代码没有异步执行任何操作。要使用await/async API,您需要在自己的方法中调用异步方法(除非您想自己实现异步逻辑)。

在您的情况下,如果您使用的是实体框架,则可以使用它的异步方法进行查询:

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()

【讨论】:

  • 感谢先生向一个不起眼的菜鸟解释这一点!
【解决方案2】:

您缺少 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2022-11-06
    • 2011-08-28
    相关资源
    最近更新 更多