[英]Async/Await and multi-layer web application
由于一些优化问题,我决定将控制器的操作方法重写为异步方法。 它是一个多层应用程序,因此,我面临一个体系结构问题,我想知道下面将显示的两个方法之间的主要区别是什么。 假设我的同步方法是:
public virtual ActionResult Method()
{
SomeLogic.LargeOperation();
return View(...);
}
LargeOpertation做很多事情。 这是伪代码:
public void LargeOpertion() {
DatabaseManipulations1();
IndependentWork();
CallingToWebService1();
IndependentWork();
DatabaseManipulations2();
IndependentWork();
CallingToWebService2();
IndependentWork();
}
LargeOperations内部的每个方法内部都有几个方法,依此类推……问题是:我是否需要使它们全部异步并在几乎每个应用程序层中使用await?
public virtual Task<ActionResult> Method()
{
await SomeLogic.LargeOperation();
return View(...);
}
public async Task LargeOpertion() {
await DatabaseManipulations1();
IndependentWork();
await CallingToWebService1();
IndependentWork();
await DatabaseManipulations2();
IndependentWork();
await CallingToWebService2();
IndependentWork();
}
或者我可以像这样在LargeOpertaion上使用任务:
public virtual Task<ActionResult> Method()
{
await Task.Run(() => SomeLogic.LargeOperation());
return View(...);
}
我们还假设IndependentWork()不太大。
由于一些优化问题,我决定将控制器的操作方法重写为异步方法。
在开始之前,您应该意识到async
将为您带来什么,而不会给您带来什么 。
异步操作不会更快地运行。 因此,对数据库的异步调用不会比对数据库的同步调用更快。
await
不会尽早返回浏览器。 它所做的只是将当前线程释放回ASP.NET线程池。
因此,每个单独的请求仍会花费相同的总时间(实际上,只是稍长一些 ,但不是可检测的时间)。
async
对可伸缩性的帮助在于可伸缩性,即应用程序使用相同资源处理更多请求的能力。 然而,它不仅可以帮助你的web应用程序的可扩展性-它不能达到神奇到你的数据库,并作出这样的规模。 因此,如果您的可伸缩性瓶颈是数据库而不是ASP.NET(通常是这种情况),那么async
将完全无法帮助您。
如果你的数据库后端是可扩展的(例如,NoSQL的,Azure的SQL或数据库集群), 如果你的ASP.NET应用程序需要扩大规模,那么你就可以受益于async
。
我是否需要使它们全部异步并在几乎每个应用程序层中使用await?
最好的方法是从“叶子”(最低层的方法)开始,然后从那里开始。 在这种情况下,请从数据库交互开始,然后将其首先转换为async
。
但是,绝对不要使用Task.Run
或Task.Factory.StartNew
。 相反,请使用真正的异步API,例如EF6中的async
支持。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.