实体框架在使用异步调用时挂起
本文关键字:调用 挂起 异步 框架 实体 | 更新日期: 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);
}