这两种行动方法有什么区别?
public ActionResult Index()
{
var task = new ServiceClient().GetProductsAsync();
return View(task.Result);
}
public async Task<ActionResult> Index()
{
var task = new ServiceClient().GetProductsAsync();
return View(await task);
}
答案 0 :(得分:6)
第一个将阻止ASP.Net请求线程,直到从数据库中获得结果。
第二个将立即释放ASP.Net线程,然后在结果出现时再抓一个。
因此,第二个更具可扩展性。
请注意,此答案假定您正在调用的异步链正确写入并以实际的异步套接字操作结束。
答案 1 :(得分:2)
第一个将阻止ASP.NET请求线程,直到任务完成 第二个将立即释放线程,然后在任务完成时再抓取另一个。
有什么好处?
线程实际上是一个非常昂贵的资源。它消耗OS资源,而Thread有一个Stack,它包含在进入方法之前调用的所有方法的所有变量。让我们说你的服务器足够强大,它可以处理100个线程。您可以处理100个请求。让我们说处理每个请求需要100毫秒。这样每秒可以提供1000个请求。
假设您的GetProductAsync()调用需要90毫秒的100毫秒。数据库或服务占用大部分时间并不罕见。进行这些调用异步意味着您现在只需要每个线程10ms。突然间,您可以在同一台服务器上支持每秒10000个请求。
因此,“异步控制器的优势”可能是每秒多10倍的请求。
当然,这一切都取决于后端的可扩展性,但是当.NET为您完成所有艰苦工作时,为什么会引入瓶颈。除了异步之外,它还有很多东西,而且细节中的魔鬼一如既往。有很多资源需要帮助,例如http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx