14

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

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

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

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
}
4

1 回答 1

17

这是测试版中的一个已知错误。引用斯蒂芬·图布的话:

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

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

在配置文件的 appSettings 部分中。

于 2012-03-09T14:39:17.370 回答