Asp.net mvc 4 使用异步操作运行同步代码

Asp.net mvc 4 使用异步操作运行同步代码,asp.net-mvc-4,async-await,Asp.net Mvc 4,Async Await,我有一个搜索操作,它有两条路径,一条同步路径,只返回一个简单视图,另一条异步路径,异步搜索,然后返回一个视图。两者都是GET请求,因此它们是同一操作的一部分 问题是,当我访问操作“localhost:XXXX/Home/Search”时,页面只会无限加载。使用Fiddler,我可以看到请求永远不会返回。我已经对它进行了调试,它一直运行到最后一行代码,但是,请求仍然没有完成 我已将复制简化为以下内容: public async Task<ActionResult> Search()

我有一个搜索操作,它有两条路径,一条同步路径,只返回一个简单视图,另一条异步路径,异步搜索,然后返回一个视图。两者都是GET请求,因此它们是同一操作的一部分

问题是,当我访问操作“localhost:XXXX/Home/Search”时,页面只会无限加载。使用Fiddler,我可以看到请求永远不会返回。我已经对它进行了调试,它一直运行到最后一行代码,但是,请求仍然没有完成

我已将复制简化为以下内容:

public async Task<ActionResult> Search() 
{ 
    return View(); 
} 
公共异步任务搜索()
{ 
返回视图();
} 
VS11警告我代码将在没有等待的情况下同步运行,这很好,但是请求没有完成

这样行吗?还是我需要在这里做点别的

编辑

这是针对.NET4.5的MVC4

编辑2

对于那些在代码中看得更清楚的人,这就是为什么我需要异步操作中的同步:

public async Task<ActionResult> Search(string query = null)
{
    if (string.IsNullOrWhiteSpace(query))
        return View(new SearchViewModel());   // never loads

    var model = await _someService.SearchAsync(query);
    return View(model);    // loads
}
公共异步任务搜索(字符串查询=null)
{
if(string.IsNullOrWhiteSpace(查询))
返回视图(新的SearchViewModel());//从不加载
var model=await\u someService.SearchAsync(查询);
返回视图(模型);//加载
}

这是测试版中已知的错误

简单的回答是,ASP.NET MVC在.NET 4.5测试版中存在一个已知的bug,当异步方法同步完成时会导致此问题。在修复可用之前,一个简单的解决方法是添加“wait Task.Yield();”作为异步方法的第一行,强制异步完成。要使其正常工作,您还需要确保使用的是.NET 4.5中ASP.NET提供的新SynchronizationContext,这意味着确保您有以下行:

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />

在配置文件的appSettings部分中


我认为这应该行得通,但由于某种原因不行。由于它在内部抛出并捕获一个
NullReferenceExcpetion
,我认为这是一个bug。提示:如果您的操作方法返回一个
任务,请确保继承自
AsyncController
,而不是
Controller
。2@vcsjones,我试过了,但没用。还有。@svick-可能在beta版中已经更改了,但这是必需的。那我得做些修补。好问题,好研究。