为什么"在CPU绑定上使用异步[...]方法[提供]没有任何好处,并导致更多的开销."

Fun*_*nut 2 c# asp.net-mvc multithreading asynchronous async-await

我来到这篇文章.在"选择同步或异步操作方法"下,作者声明在下列情况下不应使用异步操作方法:

这些操作主要是CPU操作,而不是涉及大量磁盘或网络开销的操作.在CPU绑定操作上使用异步操作方法不会带来任何好处并导致更多开销.

我不明白为什么会这样.因为如果我有一个计算斐波纳契数的方法,这个方法占用了30秒的计算,那么这个调用主要是CPU绑定的.不使此异步会阻塞调用线程30秒并使应用程序无响应.

你能用这个推理帮助我吗?

Yuv*_*kov 6

不使此异步会阻塞调用线程30秒并使应用程序无响应.

你混淆了并发和并行.作者正在谈论利用IO绑定操作async-await,在这里你可以在执行IO工作(如网络或数据库调用)时释放调用线程,而不是在操作完成之前同步阻塞它们.

你所说的是在后台线程上执行CPU绑定工作.在ASP.NET的上下文中,您正在执行由线程池分配的专用线程上的工作.启动新线程只是为了进行CPU绑定工作是没有用的.为此,您可以简单地在当前正在执行的线程上执行.

此外,Task.Run在ASP.NET中使用被认为是危险的.您应该只卸载使用运行时环境注册其工作的对象,例如BackgroundTaskManager.

如果这是一个UI应用程序并且您有一个CPU绑定操作,那么将工作推迟到后台线程将是一个有效的事情,使用Task.Run.