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

问题描述:

我有一个搜索操作,它有两个路径,一个同步路径,它只是返回一个简单视图,另一个是异步路径,它异步执行搜索,然后返回一个视图。两者都是GET请求,所以它们是同一动作的一部分。使用异步操作来运行同步代码

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

我已经简化了摄制于以下内容:

public async Task<ActionResult> Search() 
{ 
    return View(); 
} 

VS11警告我的代码将没有的await,这是很好的同步运行,但请求无法完成。

应该这样工作吗?还是我需要在这里做点别的?

编辑

这是MVC 4靶向.NET 4.5。

编辑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 
} 
+0

我认为这*应该*工作,但由于某种原因不。由于它在内部抛出并捕获了'NullReferenceExcpetion',我认为这是一个错误。 – svick 2012-03-09 13:08:14

+1

提示:如果您的操作方法返回了“任务”,请确保您从'AsyncController'继承,而不是'Controller'。 – vcsjones 2012-03-09 13:30:11

+0

2 @ vcsjones,我试过了,但它没有帮助。 [它不应该在MVC4中](http://msdn.microsoft.com/en-us/library/system.web.mvc.asynccontroller%28v=vs.108%29.aspx)。 – svick 2012-03-09 13:36:41

这是在公测一个已知的bug。 To quote Stephen Toub:

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

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

在配置的appSettings部分文件。