Loading

NET-async-await是否会创建新线程

先上结论

  1. CPU密集型操作,比如计算,如果不使用Task,ThreadPool、Thread,则不会创建新线程,否则必然会有一个线程阻塞并且忙于完成该计算任务
  2. IO密集型操作,如HTTP,读写文件,不会创建新线程(不会有线程阻塞,但是任务完成时会有线程池内的专用IO线程进行通知)

async await是否创建新的线程?

async await 本身是不会创建新线程的,这点在刚学习.NET的时候会搞错这一点,误以为会创建新线程,其实并不会,特别是我们在进行IO操作时,比如读写文件,这个时候是异步的,并没有创建新的线程,而是在请求执行完成之后,由线程池内的部分线程来通知请求完成,但整个过程并没有线程被阻塞,参考下面这段话:

由于库/BCL 使用标准的 P/Invoke 重叠 I/O 系统,它已经向 I/O 完成端口 (IOCP) 注册了句柄,它是线程池的一部分。所以一个 I/O 线程池线程被短暂地借用来执行 APC,它通知任务它已经完成
其中I/O线程是是线程池中的 I/O 线程之一,ThreadPool 在其 IOCP 中保留了一些已注册的线程;这些与大多数人与 ThreadPool 关联的工作线程不同。ThreadPool 管理工作线程和 I/O 线程。

重点,以上只针对IO操作,对于CPU密集型操作,比如使用await Task.Run(...),这个操作是会在新线程上执行的,当然这不是async await的原因,是Task.Run的原因

  1. https://stackoverflow.com/questions/27265818/does-the-use-of-async-await-create-a-new-thread
  2. https://blog.stephencleary.com/2013/11/there-is-no-thread.html
posted @ 2023-01-12 09:23  李正浩  阅读(247)  评论(0编辑  收藏  举报