当代码的所有部分都不是异步时,异步Web服务有什么好处

Sti*_*son 8 c# asynchronous servicestack asp.net-web-api

我想知道如果不是代码的所有部分都是异步的,那么使用异步http请求会带来多少好处.

让我们考虑一下场景:1)异步http请求阻塞同步数据库调用,以及2)同步等待异步数据库调用的http请求.

1)Web Api支持异步操作方法,但是如果我在处理请求时执行同步数据库调用,那么线程会阻塞调用,而且我不会从async可以给我或更好的线程经济中获益吗?

2)如果我有等待异步数据库调用的同步ServiceStack服务调用,那么会发生什么?我假设一个线程被保留用于处理整个同步http请求,当这个线程等待异步调用时,它仍然保留给Web请求或者什么?

基本上我的问题可归结为:如果不是所有IO调用都是异步的话,有没有理由使用异步?

Ste*_*ary 7

在服务器端,部分async解决方案通常没有任何好处.

1)Web Api支持异步操作方法,但是如果我在处理请求时执行同步数据库调用,那么线程会阻塞调用,而且我不会从async可以给我或更好的线程经济中获益吗?

正确.只要执行同步(阻塞)数据库调用,就会在该调用期间占用一个线程.因此,您所获得的好处async不适用.

2)如果我有等待异步数据库调用的同步ServiceStack服务调用,那么会发生什么?我假设一个线程被保留用于处理整个同步http请求,当这个线程等待异步调用时,它仍然保留给Web请求或者什么?

这与同步数据库调用相同.在封面下,同步数据库调用异步执行实际调用,然后阻塞调用线程直到它完成.因此,在通话期间,您仍然会阻止线程,并且您无法获得任何async好处.

基本上我的问题可归结为:如果不是所有IO调用都是异步的话,有没有理由使用异步?

还有一些更加模糊的场景.您可以使用Task.WhenAll有限类型的并发,这async比其他形式的异步并发更容易.但如果你没有完全async堆叠,这是我能想到的唯一好处.