C# MVC4控制器中的异步和等待

C# MVC4控制器中的异步和等待,c#,.net,asp.net-mvc,asp.net-mvc-4,async-await,C#,.net,Asp.net Mvc,Asp.net Mvc 4,Async Await,每次尝试使用新的Async和wait运算符并从数据库返回对象集合时,我都会得到一个无效操作异常。当我使用它只返回单个项目时,它工作正常 控制器代码: public async Task<ActionResult> EnvironmentList() { EfEnvironmentDataAccess dataAccess = new EfEnvironmentDataAccess(); ICollection<Environment> environmen

每次尝试使用新的
Async
wait
运算符并从数据库返回对象集合时,我都会得到一个
无效操作
异常。当我使用它只返回单个项目时,它工作正常

控制器代码:

public async Task<ActionResult> EnvironmentList()
{
    EfEnvironmentDataAccess dataAccess = new EfEnvironmentDataAccess();
    ICollection<Environment> environments = await dataAccess.GetAllEnvironmentsAsync();
    return PartialView(environments);
}
公共异步任务环境列表()
{
EfEnvironmentDataAccess dataAccess=新EfEnvironmentDataAccess();
ICollection environments=await dataAccess.GetAllEnvironmentsAsync();
返回局部视图(环境);
}
查看代码:

<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")

表转储
@动作(“环境列表”、“环境”)
@动作(“计算机列表”、“计算机”)
@动作(“产品列表”、“产品”)
@Action(“InstanceList”,“Instance”)
@动作(“ProfileList”、“Profile”)
数据访问代码:

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());
}
公共ICollection GetAllenEnvironments()
{
使用(EcuWebDataContext db=new EcuWebDataContext())
{
返回db.Environments.OrderBy(e=>e.Name.ToList();
}
}
公共异步任务GetAllenEnvironmentsAsync()
{
返回等待任务。运行(()=>GetAllenEnvironments());
}
我得到的错误是:

描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源

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

首先,我想这就是你想要做的

其次,通过旋转另一个线程来执行代码,您没有在这里执行任何异步处理,代码行如下:

Task.Run(() => GetAllEnvironments());
它将在一天结束时阻塞一个线程,而您除了上下文切换开销之外什么都没有。EF6将支持异步处理。对于纯ADO.NET异步查询,请查看:


这个问题已经有一段时间没有得到回答了。但我在MVC5中也遇到了类似的情况,我可以通过注释web.config文件
部分下面的行,使[ChildActionOnly]异步工作

<system.web>
    <!--<httpRuntime targetFramework="4.5" />-->

编辑:
当你找到一个真正的解决方案时,考虑一下这一点。请参阅下面Leri的评论。

这一问题已经有一段时间没有得到回答,但另一种解决方法如下:

从操作调用您的方法

@Html.Action("YourSyncMethod", "YourController")
将其定义为正常同步操作

public ActionResult YourSyncMethod()
然后在其中调用异步方法

var taskResponse = YourAsyncMethod(); 
它将返回一个包含您所需内容的模型

private async Task<YourModel> YourAsyncMethod()
专用异步任务YourAsyncMethod()

这似乎比篡改配置选项或创建更复杂的代码要简单

我在mvc5中遇到了这个错误。我不知道我们不能对子操作使用异步处理。只要删除Async,它就可以工作了。伟大的嗯,事实上,这很管用,但很奇怪为什么。我很想知道原因。刚才检查了一下,评论说你的web应用程序的目标是.net 4.0,它根本没有async/await。基本上,你正在失去所有的收益。所以这不是解决办法