为什么"使用异步[…][提供]没有任何好处,并且会导致更多的开销

本文关键字:开销 quot 异步 为什么 提供 任何好 | 更新日期: 2023-09-27 18:01:16

我偶然发现了这篇文章。在"选择同步或异步操作方法"中,作者指出,在以下情况下不应该使用异步操作方法:

操作主要是CPU操作,而不是涉及大量磁盘或网络开销的操作。在cpu受限的操作上使用异步操作方法没有任何好处,而且会导致更多的开销。

我不明白为什么会这样。因为如果我有一个计算斐波那契数列的方法需要30秒的计算,这个调用主要是CPU限制的。如果不异步,将会阻塞调用线程30秒,并使应用程序无响应。

你能帮我解释一下那个推理吗?

为什么"使用异步[…][提供]没有任何好处,并且会导致更多的开销

不异步将阻塞调用线程30秒使应用程序无响应。

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

你说的是在后台线程上执行CPU绑定工作。在ASP。. NET中,您正在线程池分配的专用线程上执行工作。仅仅为了执行CPU限制的工作而启动一个新线程是没有用的。为此,您可以简单地在当前正在执行的线程上执行。

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

如果这是一个UI应用程序,你有一个CPU绑定操作,然后延迟工作到后台线程将是一个有效的事情要做,使用Task.Run

对于包括我在内的许多开发人员来说,异步编程实际上是相当模糊的。我一直认为异步编程是并发的,而不是并行的。这意味着我们利用它的等待时间来做其他事情,并有一种平行的感觉。但实际上,几天前我偶然发现了这个视频。视频链接->https://www.youtube.com/watch?v=il9gl8MH17s&lc=UgydFEXyhyXe7iAeR5J4AaABAg.9NxtCJSI5xK9O-YwEIp2KR它与在CIL中查看的状态机进行了相当深入的讨论。但我们感兴趣的是他展示的第一个线程实际上在忙着旋转一个循环的部分。时间戳是7:50。您可以清楚地看到,虽然现在一个线程被阻塞,并且在kettle方法中的等待时间已经结束,但是当一个线程正在循环时,该方法实际上已经完成。然后,他检查查看线程ID。. net为函数的完成生成了一个全新的线程。我和开发人员谈过,他说你不知道它是并发的还是并行的。如果需要,将进行优化。我肯定会对这部分做更多的研究,但现在这是我能给出的最好的指导。因此,有了这些知识(目前),我想说,它实际上并没有损害CPU密集型任务的性能。

编辑**这是我从微软找到的东西:如果您有任何I/o限制需求(例如从网络请求数据、访问数据库或读写文件系统),您将希望利用异步编程。您还可以有cpu限制的代码,例如执行昂贵的计算,这也是编写异步代码的好场景。

c#有一个语言级的异步编程模型,它允许轻松地编写异步代码,而不必纠结于回调或遵循支持异步的库。它遵循所谓的基于任务的异步模式(TAP)。链接到文本->https://learn.microsoft.com/en-us/dotnet/csharp/async