C# 实体框架在使用异步调用时挂起
我不熟悉使用异步,这似乎让我无法理解原因或问题是什么,当我尝试加载网页时,异步调用似乎挂起,而页面从未加载。我在这里的实现是错误的吗 控制器C# 实体框架在使用异步调用时挂起,c#,entity-framework,asynchronous,asp.net-mvc-5.1,C#,Entity Framework,Asynchronous,Asp.net Mvc 5.1,我不熟悉使用异步,这似乎让我无法理解原因或问题是什么,当我尝试加载网页时,异步调用似乎挂起,而页面从未加载。我在这里的实现是错误的吗 控制器 public ActionResult Index() { var model = _partyAddOnService.Get().Result.Select(x => new AddOnModel() { Id = x.Id, AddOnType = x.AddOnType, De
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();
}
*调试和查看任务状态时,会显示“等待激活”
还尝试使用本文建议的ConfigureAwait方法。(见下文詹姆斯的评论)
公共异步任务Get()
{
返回await\u repository.GetAsync().ConfigureAwait(false);
}
您正在导致死锁,因为您没有一直实现异步等待模式。还可以在最低级别上使用.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);
}
公共异步任务索引()
{
var model=await\u partyAddOnService.Get().Result.Select(x=>newaddonmodel())
{
Id=x.Id,
AddOnType=x.AddOnType,
描述=x.描述,
Name=x.Name,
价格=x.价格
});
返回视图(模型);
}
要防止死锁,只需一直使用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);
}
公共异步任务。也就是说,Get
应该是GetAsync
您的代码是。如果要同步获取调用结果,为什么要使用async<代码>结果
阻塞。我想死锁是我的控制器?不知道如何修复。@usr是的,我读的越多,我就越意识到这一切都是浪费时间和精力。我将删除它,只需同步调用数据库。我没有任何方法依赖于对数据库的多次调用,EF根据FK自动返回我的子数据,因此我不需要多次调用。我只是想在我的代码架构中积极主动。该死的年轻开发者综合症。谢谢大家的帮助@yycdev这是个明智的选择。为什么这会被否决?作为一个试图学习和理解异步的人,我很想知道是否有什么不应该在这里做的事情?使用异步IO,然后阻塞,这一点是错误的,它会让你从两个世界中都得到最坏的结果@因为这个原因,你自己的代码也没有意义。
public async Task<IEnumerable<AddOn>> Get()
{
return await _repository.GetAsync().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);
}
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);
}