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

NET-async-await是否会创建新线程的更多相关文章

  1. 廖雪峰Java11多线程编程-1线程的概念-2创建新线程

    Java语言内置多线程支持: 一个Java程序实际上是一个JVM进程 JVM用一个主线程来执行main()方法 在main()方法中又可以启动多个线程 1.创建新线程 1.1 方法一:使用Thread ...

  2. 多线程编程之Windows环境下创建新线程

    转自: http://www.cnblogs.com/lgxqf/archive/2009/02/10/1387480.html 在 Win32 API 中,创建线程的基本函数是 CreateThre ...

  3. Spark无法创建新线程

    Spark提交程序报错,无法创建新的线程 原因是因为这台公用机器上跑的进程太多了,需要修改Linux参数,允许用户最大进程数 查看允许用户最大进程数配置 ulimit -a 修改允许用户最大进程数配置 ...

  4. Java8使用实现Runnable接口方式创建新线程的方法

    环境介绍 JDK版本:1.8 开发架构:spring boot 2.x 日志:slf4j 实现步骤 Runnable接口中只有一个run()方法,它是非Thread类子类的类提供的一种激活方式.一个类 ...

  5. js异步回调Async/Await与Promise区别 新学习使用Async/Await

    Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...

  6. Thread 和 Runnable创建新线程的区别,Runnable可以共享线程类的实例属性

    Thread实现多线程: public class Thread2 extends Thread{ public  int i; public void run(){ for(; i < 100 ...

  7. spring-data-redis 关于订阅客户端不断创建新线程的问题

    项目中使用了spring-data-redis 实现消息订阅功能,原来的配置是这样子: <redis:listener-container connection-factory="je ...

  8. jfinal afterJFinalStart中执行长久循环操作的解决方案:创建新线程

    很多时候,需要在jfinal中afterJFinalStart方法中,写一些需要一直循环运行的程序,做一些循环操作.但是在afterJFinalStart中,执行时间过长的话,会导致整个站点启动超时. ...

  9. C# 创建新线程

    首先需要包含命名空间 using System.Threading; 然后创建进程 Thread th = new Thread(new ThreadStart(ThreadMethod)); //创 ...

  10. 浅谈C#中的 async await 以及对线程相关知识的复习

    C#5.0以后新增了一个语法糖,那就是异步方法async await,之前对线程,进程方面的知识有过较为深入的学习,大概知道这个概念,我的项目中实际用到C#异步编程的场景比较少,就算要用到一般也感觉T ...

随机推荐

  1. 图解不同版本的HTTP协议

    前言 大家好,我是蜗牛,今天我们聊聊HTTP协议,通过这篇文章我们能了解到不同版本HTTP优缺点.他们之间的性能差异以及现在主流的HTTP协议用的那个版本 HTTP/1.1 时代 HTTP/1.1 对 ...

  2. 一篇文章带你了解热门版本控制系统——Git

    一篇文章带你了解热门版本控制系统--Git 这篇文章会介绍到关于版本控制的相关知识以及版本控制神器Git 我们可能在生活中经常会使用GitHub网页去查询一些开源的资源或者项目,GitHub就是基于G ...

  3. [Oracle]复习笔记-SQL部分内容

    Oracle笔记--SQL部分 整体框架 语句的执行顺序:from →where →group by→having→select→order by select * from * where * gr ...

  4. ML-梯度下降法的详细推导与代码实现

    计算 对于线性回归,梯度下降法的目标就是找到一个足够好的向量\(\theta\),使代价函数\(J(\theta) = \sum_{i=1}^{m}(\hat{y}-y_{i})^{2}\)取得最小值 ...

  5. 怎么实现无痛刷新token

    最近遇到这个需求,前端登录后,后端返回  access_token 和 refresh_token ,当token 过期时用旧的 refresh_token 去获取新的token,前端要不痛去刷新to ...

  6. Idea在windows和mac中的一些快捷指令

    从 Windows 过度到 Mac 必备快捷键对照表 Mac 键盘符号说明 ⌘ == Command ⇧ == Shift ⇪ == Caps Lock ⌥ == Option ⌃ == Contro ...

  7. 思维分析逻辑 2 DAY

    目录 数据分析多元思维模型 微观能力 中观能力 宏观能力 电商平台分析 整体数据 漏斗模型 互联网金融分析 授信模型 了解芝麻信用分结构 数据源的数据变量 数据处理 游戏数据分析 常规指标 商业化指标 ...

  8. windows环境变量修改器

    软件及源码 前言 我一直再用win7的系统,当更改path环境变量的时候很难受, 就只能看到一段,然后前面有啥后面有啥都看不到,而且来回调整优先级的时候需要剪切粘贴,主要就是来回调节优先级特别麻烦.所 ...

  9. nuxt作为主应用接入qiankun的实践(附代码)

    上半年一直在倒腾qiankun,在使用nuxtjs接入qiankun时遇到了一些坑,记录并分享出来,希望能帮助到大家. 代码地址:nuxtjs-qiankun-demo Nuxtjs接入qiankun ...

  10. 《浅谈亚 log 数据结构在 OI 中的应用》阅读随笔

    这篇又长长长了! \(8435\to 8375\to 9729\) 早就馋这篇了!终于学了( 压位 Trie 确实很好写啊 但是总感觉使用范围不是很广的样子 似乎是见的题少 原文里都在用 \(\log ...