混合使用同步方法时,可以在Web API中实现异步/等待的好处

Ang*_*ker 2 .net c# asp.net asp.net-mvc async-await

我的目标是提高我正在开发的Web API的可伸缩性。为此,我将控制器动作实现为async。想法是释放请求线程并可以处理其他传入请求。但是,各州的成功答案是Effectively use async/await with ASP.NET Web API:

您需要一个真正的异步实现来获得异步的可伸缩性优势。

最终,我的代码需要从第三方库中调用非常同步,单线程和I / O绑定的方法。因此,真正做到这一点的唯一方法是通过Task.Run(),我认为它将保留在线程上-从而取消了异步/等待的好处。

那么,当混合操作中存在同步操作时,是否有一种方法可以在Web API方案中实现异步/等待的好处?

Ste*_*ary 5

那么,当混合操作中存在同步操作时,是否有一种方法可以在Web API方案中实现异步/等待的好处?

否。原因很简单:异步通过释放其线程提供了其好处,而同步操作则阻塞了一个线程。

服务器端异步的好处是可伸缩性。异步提供了更好的可伸缩性,因为它在不需要时释放线程。

根据定义,同步API会阻塞线程。如果API是受I / O约束的操作,则它阻塞的线程主要是等待I / O,即不需要该线程,但也无法释放该线程。

没有办法解决这个问题。同步API 必须阻塞线程,因此您无法获得异步的好处。

如果您有GUI应用程序,则有一种解决方法。在客户端,异步的主要好处是响应能力。异步通过在不需要时释放UI线程来提供更好的响应性。

对于GUI应用程序,您可以使用Task.Run阻止线程池线程,并且UI线程保持响应状态。这是一个适当的解决方法。在服务器应用程序上,Task.Run像这样使用是一种反模式,因为它会强制执行线程切换,然后无论如何您仍然会遇到阻塞的线程(防止任何可伸缩性的好处),因此Task.Run只会减慢代码的速度,根本没有任何好处。