首页 > 其他分享 >NET-async-await是否会创建新线程

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

时间:2023-01-12 09:36:53浏览次数:64  
标签:创建 await ThreadPool 线程 async NET

title: .NET async/await是否会创建新线程
date: 2022-12-06 10:36:46
tags:
- .NET

先上结论

  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

标签:创建,await,ThreadPool,线程,async,NET
From: https://www.cnblogs.com/lizhenghao126/p/17045480.html

相关文章

  • Vue 中 Promise 的then方法异步使用及async/await 异步使用总结
    转载请注明出处:1.Promise的then方法使用then方法是 Promise中处理的是异步调用,异步调用是非阻塞式的,在调用的时候并不知道它什么时候结束,也就不会等到他......
  • JUC源码学习笔记5——1.5w字和你一起刨析线程池ThreadPoolExecutor源码,全网最细doge
    源码基于JDK8文章1.5w字,非常硬核系列文章目录和关于我一丶从多鱼外卖开始话说,王多鱼给好友胖子钱让其投资,希望亏得血本无归。胖子开了一个外卖店卖国宴,主打高端,外卖......
  • 多线程中互斥锁与原子性的区别
    一个好的解释,原子操作是不能细分为更小部分的操作。因此,它永远不会半途而废,因此您可以保证它将始终以一致的状态被观察到。例如,现代硬件实现原子比较和交换操作。互斥锁......
  • 2.多线程编程的目标与挑战
    一.串行、并行与并发 串行:单工作者依次执行多个任务(一个任务执行完成再执行下一个任务)。 并行:多工作者同时执行多个任务(每个工作者执行一个任务)。 并发:单工作者交替......
  • C# 中使用主进程及子线程
    1usingSystem;2usingSystem.Threading;3usingSystem.Threading.Tasks;45namespaceThreadTest6{7classProgram8{9static......
  • 强哥说Java--Java多线程
    Java多线程​​前言​​​​总目录​​​​一、基本概念​​​​1.程序​​​​2.进程​​​​3.线程​​​​3.实例理解​​​​4.单核CPU和多核CPU的理解​​​​5.并行和......
  • Java线程诊断
    1.诊断CPU占用过高[root@master~]#nohupjava-jarJvmProject.jar&//有问题的java程序[1]1627[root@master~]#nohup:ignoringinputandappendingoutputto......
  • 高性能IO模型:为什么单线程Redis能那么快?
    你好,我是蒋德钧。今天,我们来探讨一个很多人都很关心的问题:“为什么单线程的Redis能那么快?”首先,我要和你厘清一个事实,我们通常说,Redis是单线程,主要是指Redis的网络IO和键......
  • async顶层await
    20.async函数-含义-《阮一峰ECMAScript6(ES6)标准入门教程第三版》-书栈网·BookStackES2017标准引入了async函数,使得异步操作变得更加方便。async函......
  • mysql delete大量数据表锁死,kill的线程后线程处于killed状态问题解决
    一、事件起因删除一张500G的表,没有添加任何约束条件,结果好久都没反应,查询锁之后,使用kill杀掉了进程,再次查询的时候,锁还在,trx_state的状态是ROLLINGBACK,使用showprocessl......