在MVC 4 Controller中异步并等待

twr*_*eid 17 .net c# asp.net-mvc async-await asp.net-mvc-4

每次我尝试使用new AsyncAwait运算符并从数据库返回一组对象时,我都会遇到Invalid Operation异常.当我使用它只返回一个项目时它工作正常.

控制器代码:

public async Task<ActionResult> EnvironmentList()
{
    EfEnvironmentDataAccess dataAccess = new EfEnvironmentDataAccess();
    ICollection<Environment> environments = await dataAccess.GetAllEnvironmentsAsync();
    return PartialView(environments);
}
Run Code Online (Sandbox Code Playgroud)

查看代码:

<div class="ECURightCol">
<h3>Table Dumps</h3>
@Html.Action("EnvironmentList", "Environment")
@Html.Action("ComputerList", "Computer")
@Html.Action("ProductList", "Product")
@Html.Action("InstanceList", "Instance")
@Html.Action("ProfileList", "Profile")
Run Code Online (Sandbox Code Playgroud)

数据访问代码:

public ICollection<Environment> GetAllEnvironments()
{
    using (EcuWebDataContext db = new EcuWebDataContext())
    {
        return db.Environments.OrderBy(e => e.Name).ToList();
    }
}

public async Task<ICollection<Environment>> GetAllEnvironmentsAsync()
{
    return await Task.Run(() => GetAllEnvironments());
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

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

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

tug*_*erk 30

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

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

Task.Run(() => GetAllEnvironments());
Run Code Online (Sandbox Code Playgroud)

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

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