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,这意味着确保您拥有以下行:
Run Code Online (Sandbox Code Playgroud)<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
在配置文件的appSettings部分中.
归档时间: |
|
查看次数: |
6103 次 |
最近记录: |