dev*_*nkd 4 c# asynchronous entity-framework asp.net-mvc-5.1
我是新手使用异步,这似乎让我不知道原因或问题是什么,当我尝试加载网页时,异步调用似乎挂起并且页面永远不会被加载.这是我的实施错了吗?
CONTROLLER
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);
}
Run Code Online (Sandbox Code Playgroud)
服务
public async Task<IEnumerable<AddOn>> Get()
{
return await _repository.GetAsync();
}
Run Code Online (Sandbox Code Playgroud)
REPOSITORY
public async Task<IEnumerable<T>> GetAsync()
{
return await Context.Set<T>().ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)
更新:
我也尝试了这个,它仍然挂起......
public ActionResult Index()
{
var model = _partyAddOnService.Get();
return View();
}
Run Code Online (Sandbox Code Playgroud)
*在调试并查看任务状态时,它显示"正在等待激活"
还尝试使用ConfigureAwait方法,如文章所建议的那样.(见詹姆斯评论如下)
public async Task<IEnumerable<AddOn>> Get()
{
return await _repository.GetAsync().ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)
为了防止死锁,只需一直使用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);
}
Run Code Online (Sandbox Code Playgroud)
我还建议您更改异步方法以结束Async,以遵循基于任务的异步模式.即,Get应该是GetAsync.
| 归档时间: |
|
| 查看次数: |
2983 次 |
| 最近记录: |