Asp.net mvc 4 使用异步操作运行同步代码
我有一个搜索操作,它有两条路径,一条同步路径,只返回一个简单视图,另一条异步路径,异步搜索,然后返回一个视图。两者都是GET请求,因此它们是同一操作的一部分 问题是,当我访问操作“localhost:XXXX/Home/Search”时,页面只会无限加载。使用Fiddler,我可以看到请求永远不会返回。我已经对它进行了调试,它一直运行到最后一行代码,但是,请求仍然没有完成 我已将复制简化为以下内容:Asp.net mvc 4 使用异步操作运行同步代码,asp.net-mvc-4,async-await,Asp.net Mvc 4,Async Await,我有一个搜索操作,它有两条路径,一条同步路径,只返回一个简单视图,另一条异步路径,异步搜索,然后返回一个视图。两者都是GET请求,因此它们是同一操作的一部分 问题是,当我访问操作“localhost:XXXX/Home/Search”时,页面只会无限加载。使用Fiddler,我可以看到请求永远不会返回。我已经对它进行了调试,它一直运行到最后一行代码,但是,请求仍然没有完成 我已将复制简化为以下内容: public async Task<ActionResult> Search()
public async Task<ActionResult> Search()
{
return View();
}
公共异步任务搜索()
{
返回视图();
}
VS11警告我代码将在没有等待的情况下同步运行,这很好,但是请求没有完成
这样行吗?还是我需要在这里做点别的
编辑
这是针对.NET4.5的MVC4
编辑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
}
公共异步任务搜索(字符串查询=null)
{
if(string.IsNullOrWhiteSpace(查询))
返回视图(新的SearchViewModel());//从不加载
var model=await\u someService.SearchAsync(查询);
返回视图(模型);//加载
}
这是测试版中已知的错误
简单的回答是,ASP.NET MVC在.NET 4.5测试版中存在一个已知的bug,当异步方法同步完成时会导致此问题。在修复可用之前,一个简单的解决方法是添加“wait Task.Yield();”作为异步方法的第一行,强制异步完成。要使其正常工作,您还需要确保使用的是.NET 4.5中ASP.NET提供的新SynchronizationContext,这意味着确保您有以下行:
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
在配置文件的appSettings部分中
我认为这应该行得通,但由于某种原因不行。由于它在内部抛出并捕获一个
NullReferenceExcpetion
,我认为这是一个bug。提示:如果您的操作方法返回一个任务,请确保继承自AsyncController
,而不是Controller
。2@vcsjones,我试过了,但没用。还有。@svick-可能在beta版中已经更改了,但这是必需的。那我得做些修补。好问题,好研究。