3

这两种动作方法有什么区别?

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);
}
4

2 回答 2

6

第一个将阻塞 ASP.Net 请求线程,直到您从数据库中获得结果。

第二个将立即释放 ASP.Net 线程,然后在结果进来时再抓取另一个。

因此,第二个更具可扩展性。

请注意,此答案假定您正在调用的异步链已正确编写并以实际的异步套接字操作结束。

于 2013-01-06T02:36:37.010 回答
2

第一个将阻塞 ASP.NET 请求线程,直到任务完成。
第二个会立即释放线程,等任务完成后再去抓另一个。

有什么好处?

线程实际上是一种非常昂贵的资源。它消耗操作系统资源,并且线程有一个堆栈,其中包含在到达您的方法之前调用的所有方法的所有变量。假设您的服务器足够强大,可以处理 100 个线程。您可以处理 100 个请求。假设处理每个请求需要 100 毫秒。这给你每秒 1000 个请求。

假设您的 GetProductAsync() 调用需要 100 毫秒中的 90 毫秒。数据库或服务占用大部分时间并不少见。使这些调用异步意味着您现在只需要每个线程 10 毫秒。突然之间,您可以在同一台服务器上支持每秒 10000 个请求。

因此,“异步控制器的优势”可能是每秒多出 10 倍的请求。

当然,这也完全取决于您的后端的可扩展性,但是当 .NET 为您完成所有艰苦的工作时,为什么还要引入瓶颈。它不仅仅是异步,还有更多的东西,而且一如既往地魔鬼在细节中。有很多资源可以提供帮助,例如http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

于 2013-01-06T02:54:42.150 回答