我对在ASP中使用异步操作有一些担忧。净MVC。什么时候它能提高应用程序的性能,什么时候不能?

在ASP中处处使用异步操作好吗?净MVC吗? 关于可等待方法:当我想查询数据库(通过EF/NHibernate/其他ORM)时,我应该使用async/await关键字吗? 在一个操作方法中,我可以使用await关键字异步查询数据库多少次?


当前回答

在ASP中处处使用异步操作好吗?净MVC吗?

在编程中,这要视情况而定。在走某条路的时候总是要权衡取舍的。

async-await shines in places where you know you'll receiving concurrent requests to your service and you want to be able to scale out well. How does async-await help with scaling out? In the fact that when you invoke a async IO call synchronously, such as a network call or hitting your database, the current thread which is responsible for the execution is blocked waiting for the request to finish. When you use async-await, you enable the framework to create a state machine for you which makes sure that after the IO call is complete, your method continues executing from where it left off.

需要注意的一点是,这个状态机有一个微妙的开销。使方法异步化并不会使它执行得更快,这是需要理解的一个重要因素,也是许多人存在的一个误解。

在使用async-await时需要考虑的另一件事是,它始终是异步的,这意味着您将从上到下看到async贯穿整个调用堆栈。这意味着如果您想公开同步API,您将经常发现自己重复了一定数量的代码,因为异步和同步不能很好地混合在一起。

我应该使用异步/等待关键字当我想查询数据库(通过 EF / NHibernate /其他ORM) ?

如果您选择使用异步IO调用,那么是的,async-await将是一个不错的选择,因为越来越多的现代数据库提供者公开了实现TAP(任务异步模式)的异步方法。

多少次我可以使用等待关键字查询数据库 异步在一个单一的行动方法?

只要您遵守数据库提供商规定的规则,您想要多少就有多少。异步调用的数量没有限制。如果您有相互独立且可以并发执行的查询,则可以为每个查询旋转一个新任务并使用await task。WhenAll等待两者都完成。

其他回答

我的5美分:

当且仅当你做IO操作时使用async/await,比如DB或外部服务webservice。 总是选择异步调用而不是DB。 每次查询DB时。

附注:第一点有例外情况,但你需要很好地理解异步内部。

作为一个额外的优势,如果需要,你可以并行执行很少的IO调用:

Task task1 = FooAsync(); // launch it, but don't wait for result
Task task2 = BarAsync(); // launch bar; now both foo and bar are running
await Task.WhenAll(task1, task2); // this is better in regard to exception handling
// use task1.Result, task2.Result

在ASP中处处使用异步操作好吗?净MVC吗?

在编程中,这要视情况而定。在走某条路的时候总是要权衡取舍的。

async-await shines in places where you know you'll receiving concurrent requests to your service and you want to be able to scale out well. How does async-await help with scaling out? In the fact that when you invoke a async IO call synchronously, such as a network call or hitting your database, the current thread which is responsible for the execution is blocked waiting for the request to finish. When you use async-await, you enable the framework to create a state machine for you which makes sure that after the IO call is complete, your method continues executing from where it left off.

需要注意的一点是,这个状态机有一个微妙的开销。使方法异步化并不会使它执行得更快,这是需要理解的一个重要因素,也是许多人存在的一个误解。

在使用async-await时需要考虑的另一件事是,它始终是异步的,这意味着您将从上到下看到async贯穿整个调用堆栈。这意味着如果您想公开同步API,您将经常发现自己重复了一定数量的代码,因为异步和同步不能很好地混合在一起。

我应该使用异步/等待关键字当我想查询数据库(通过 EF / NHibernate /其他ORM) ?

如果您选择使用异步IO调用,那么是的,async-await将是一个不错的选择,因为越来越多的现代数据库提供者公开了实现TAP(任务异步模式)的异步方法。

多少次我可以使用等待关键字查询数据库 异步在一个单一的行动方法?

只要您遵守数据库提供商规定的规则,您想要多少就有多少。异步调用的数量没有限制。如果您有相互独立且可以并发执行的查询,则可以为每个查询旋转一个新任务并使用await task。WhenAll等待两者都完成。

在ASP中处处使用异步操作好吗?净MVC吗?

在任何可以使用异步方法的地方这样做都是很好的,特别是当你在工作进程级别有性能问题时,这发生在大量数据和计算操作中。否则,不需要,因为单元测试将需要强制转换。

关于可等待方法:我是否应该使用async/await关键字当我 想查询一个数据库(通过EF/NHibernate/其他ORM)?

是的,最好对任何DB操作使用异步,以尽可能避免工作进程级别的性能问题。 注意,EF已经为大多数操作创建了许多异步选项,例如:

.ToListAsync()
.FirstOrDefaultAsync()
.SaveChangesAsync()
.FindAsync()

我可以使用await关键字查询数据库多少次 异步在一个单一的动作方法?

前途无量

你可能会发现我在MSDN上关于这个主题的文章很有帮助;在那篇文章中,我花了很多篇幅描述什么时候应该在ASP上使用异步。NET,而不仅仅是如何在ASP.NET上使用async。

我对在ASP中使用异步操作有一些担忧。净MVC。什么时候它能提高我的应用程序的性能,什么时候呢?

首先,要理解async/await是关于释放线程的。在GUI应用程序上,它主要是关于释放GUI线程,以便更好的用户体验。在服务器应用程序(包括ASP。NET MVC),它主要是关于释放请求线程,以便服务器可以扩展。

特别是,它不会:

让您的个人请求更快地完成。事实上,他们会完成(只是一点点)慢一点。 当您按下等待按钮时,返回到调用者/浏览器。只等待ASP的“屈服”。NET线程池,不给浏览器。

第一个问题是——在ASP中处处使用异步操作好吗?净MVC吗?

我想说,在I/O的任何地方都使用它是很好的。不过,这未必是有益的(见下文)。

但是,将它用于cpu绑定的方法是不好的。有时候开发者认为他们可以通过调用Task来获得异步的好处。在他们的控制器中运行,这是一个可怕的想法。因为这段代码最终会占用另一个线程来释放请求线程,所以根本没有任何好处(事实上,它们正在承担额外线程切换的代价)!

当我想查询数据库(通过EF/NHibernate/其他ORM)时,我应该使用async/await关键字吗?

您可以使用任何可用的可等待方法。现在大多数主流游戏都支持异步,但也有少数不支持。如果你的ORM不支持异步,那么不要尝试将它包装在Task中。运行或类似的操作(参见上面)。

Note that I said "you could use". If you're talking about ASP.NET MVC with a single database backend, then you're (almost certainly) not going to get any scalability benefit from async. This is because IIS can handle far more concurrent requests than a single instance of SQL server (or other classic RDBMS). However, if your backend is more modern - a SQL server cluster, Azure SQL, NoSQL, etc - and your backend can scale, and your scalability bottleneck is IIS, then you can get a scalability benefit from async.

第三个问题-多少次我可以使用等待关键字查询数据库异步在一个单一的行动方法?

你想要多少都可以。但是,请注意,许多orm具有每个连接一个操作的规则。特别地,EF只允许每个DbContext执行单个操作;无论操作是同步的还是异步的,都是如此。

另外,请再次记住后端的可伸缩性。如果您正在使用单个SQLServer实例,并且您的IIS已经能够保持SQLServer的最大容量,那么对SQLServer施加两倍或三倍的压力根本不会对您有任何帮助。

我的经验是,今天很多开发人员使用async/await作为控制器的默认设置。

我的建议是,只有在你知道它对你有帮助的时候才使用它。

原因是,正如Stephen Cleary和其他人已经提到的,它会引入性能问题,而不是解决问题,并且它只会在特定的场景中帮助您:

高流量控制器 可伸缩的后端