在MVC 4 Controller中异步并等待

每次我尝试使用新的AsyncAwait运算符并从数据库返回一组对象时,我都会收到Invalid Operationexception。 当我使用它只返回一个项目时它工作正常。

控制器代码:

 public async Task EnvironmentList() { EfEnvironmentDataAccess dataAccess = new EfEnvironmentDataAccess(); ICollection environments = await dataAccess.GetAllEnvironmentsAsync(); return PartialView(environments); } 

查看代码:

 

Table Dumps

@Html.Action("EnvironmentList", "Environment") @Html.Action("ComputerList", "Computer") @Html.Action("ProductList", "Product") @Html.Action("InstanceList", "Instance") @Html.Action("ProfileList", "Profile")

数据访问代码:

 public ICollection GetAllEnvironments() { using (EcuWebDataContext db = new EcuWebDataContext()) { return db.Environments.OrderBy(e => e.Name).ToList(); } } public async Task<ICollection> GetAllEnvironmentsAsync() { return await Task.Run(() => GetAllEnvironments()); } 

我得到的错误是:

描述:执行当前Web请求期间发生未处理的exception。 请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

exception详细信息:System.InvalidOperationException:HttpServerUtility.Execute在等待异步操作完成时被阻止。

首先, 您不能对子操作使用异步处理,我想这就是您要做的事情。

其次,你没有在这里进行任何异步处理,通过使用下面的代码行启动另一个线程来执行你的代码:

 Task.Run(() => GetAllEnvironments()); 

它将在一天结束时阻塞一个线程,除了上下文切换开销之外你什么都没有。 EF6将支持异步处理。 对于使用纯ADO.NET的异步查询,请查看:

ASP.NET MVC 4中基于任务的异步编程模型(TAP)的异步数据库调用

这个问题得到了解答已经有一段时间了。 但是我遇到了与MVC 5类似的情况,我只能通过在web.config文件的部分下面注释掉以下行来异步地[ChildActionOnly]工作。

   

编辑:当您找到适合您情况的真正解决方案时,请考虑这是一种解决方法。 请参阅下面的Leri评论。