使用异步操作运行同步代码

Dan*_*man 14 async-await asp.net-mvc-4

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

问题是当我访问动作"localhost:XXXX/Home/Search"时,页面无限加载.使用Fiddler,我可以看到请求永远不会返回.我调试了它,它使它到最后一行代码,但是,再次,请求没有完成.

我已将repro简化为以下内容:

public async Task<ActionResult> Search() 
{ 
    return View(); 
} 
Run Code Online (Sandbox Code Playgroud)

VS11警告我,代码将在没有等待的情况下同步运行,这很好,但请求没有完成.

这有用吗?或者我需要在这里做点什么吗?

编辑

这是针对.NET 4.5的MVC 4.

编辑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
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 17

这是测试版中的已知错误.引用Stephen Toub的话:

简短的回答是.NET 4.5 Beta中的ASP.NET MVC中存在一个已知错误,当​​异步方法同步完成时会导致此问题.在修复程序可用之前,一个简单的解决方法是添加"await Task.Yield();" 作为异步方法的第一行,强制它异步完成.为了使其正常工作,您还需要确保在.NET 4.5中使用ASP.NET提供的新SynchronizationContext,这意味着确保您拥有以下行:

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
Run Code Online (Sandbox Code Playgroud)

在配置文件的appSettings部分中.