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

时间:2012-03-09 00:38:54

标签: asp.net-mvc-4 async-await

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

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

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

public async Task<ActionResult> Search() 
{ 
    return View(); 
} 
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
}

1 个答案:

答案 0 :(得分:17)

这是测试版中的已知错误。 To quote Stephen Toub:

  

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

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

在配置文件的appSettings部分。