使用异步操作来运行同步代码
问题描述:
我有一个搜索操作,它有两个路径,一个同步路径,它只是返回一个简单视图,另一个是异步路径,它异步执行搜索,然后返回一个视图。两者都是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
}
答
这是在公测一个已知的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部分文件。
我认为这*应该*工作,但由于某种原因不。由于它在内部抛出并捕获了'NullReferenceExcpetion',我认为这是一个错误。 – svick 2012-03-09 13:08:14
提示:如果您的操作方法返回了“任务”,请确保您从'AsyncController'继承,而不是'Controller'。 –
vcsjones
2012-03-09 13:30:11
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