实体框架在使用异步调用时挂起

本文关键字:调用 挂起 异步 框架 实体 | 更新日期: 2023-09-27 18:09:15

我是新的使用异步,这似乎逃避了我的原因或问题是什么,当我试图加载网页异步调用似乎挂起,页面从未加载。这里我的实现有问题吗?

控制器

public ActionResult Index()
{
    var model = _partyAddOnService.Get().Result.Select(x => new AddOnModel()
    {
        Id = x.Id,
        AddOnType = x.AddOnType,
        Description = x.Description,
        Name = x.Name,
        Price = x.Price
    });
    return View(model);
}

服务
public async Task<IEnumerable<AddOn>> Get()
{
    return await _repository.GetAsync();
}

public async Task<IEnumerable<T>> GetAsync()
{
    return await Context.Set<T>().ToListAsync();
}
更新:

我也试过这个,它仍然挂起…

public ActionResult Index()
{
    var model = _partyAddOnService.Get();
    return View();
}

*调试时查看Task状态显示"Waiting for activation"

也尝试使用本文建议的ConfigureAwait方法。(见James评论)

public async Task<IEnumerable<AddOn>> Get()
{
    return await _repository.GetAsync().ConfigureAwait(false);
}

实体框架在使用异步调用时挂起

为了防止死锁,只需要一直使用async。你已经在你的服务和存储库中使用了它,所以只需将它添加到你的控制器中:

public async Task<ActionResult> Index()
{
  var model = (await _partyAddOnService.Get()).Select(x => new AddOnModel()
  {
    Id = x.Id,
    AddOnType = x.AddOnType,
    Description = x.Description,
    Name = x.Name,
    Price = x.Price
  });
  return View(model);
}

我还建议您将异步方法更改为以Async结尾,以遵循基于任务的异步模式。即Get应为GetAsync

您正在导致死锁,因为您没有一直实现async-await模式。也可以在最低级别使用. configureawait (false)。

public async Task<ActionResult> Index()
{
    var model = await _partyAddOnService.Get().Result.Select(x => new AddOnModel()
    {
        Id = x.Id,
        AddOnType = x.AddOnType,
        Description = x.Description,
        Name = x.Name,
        Price = x.Price
    });
    return View(model);
}