首页 > 编程语言 >异步编程(Thread、ThreadPool、Task、异步关键字async/await)

异步编程(Thread、ThreadPool、Task、异步关键字async/await)

时间:2023-05-26 11:44:06浏览次数:42  
标签:异步 Task Thread await ThreadPool 线程 async

一、什么是异步

Thread,是微软.Net1.0推出;

ThreadPool 是微软.Net2.0推出;

Task是微软.Net4.0推出;

async/await是微软.Net5.0推出;

       同步和异步主要用于修饰方法。当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法;当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调用者不用等待该方法执行完毕,我们称这个方法为异步方法。

       异步的好处在于非阻塞(调用线程不会暂停执行去等待子线程完成),因此我们把一些不需要立即使用结果、较耗时的任务设为异步执行,可以提高程序的运行效率。net4.0在ThreadPool的基础上推出了Task类,微软极力推荐使用Task来执行异步任务,现在C#类库中的异步方法基本都用到了Task;net5.0推出了async/await,让异步编程更为方便。本篇主要介绍Task、async/await相关的内容,其他异步操作的方式会在下一篇介绍。

 

二、Task介绍

        Task是在ThreadPool的基础上推出的,我们简单了解下ThreadPool。ThreadPool中有若干数量的线程,如果有任务需要处理时,会从线程池中获取一个空闲的线程来执行任务,任务执行完毕后线程不会销毁,而是被线程池回收以供后续任务使用。当线程池中所有的线程都在忙碌时,又有新任务要处理时,线程池才会新建一个线程来处理该任务,如果线程数量达到设置的最大值,任务会排队,等待其他任务释放线程后再执行。线程池能减少线程的创建,节省开销.

 

二、async/await介绍

        async/await是基于Task的,而Task是对ThreadPool的封装改进,主要是为了更有效的控制线程池中的线程(ThreadPool中的线程,我们很难通过代码控制其执行顺序,任务延续和取消等等);ThreadPool基于Thread的,主要目的是减少Thread创建数量和管理Thread的成本。async/await Task是C#中更先进的,也是微软大力推广的特性,我们在开发中可以尝试使用Task来替代Thread/ThreadPool,处理本地IO和网络IO任务是尽量使用async/await来提高任务执行效率。

标签:异步,Task,Thread,await,ThreadPool,线程,async
From: https://www.cnblogs.com/yuanshuo/p/17434339.html

相关文章

  • JS的异步化特征async await
    参考:https://segmentfault.com/a/1190000007535316https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promisehttps://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/awaithttps://developer.mozilla.org/zh-CN/......
  • task.6
    #include<stdio.h>#include<string.h>#include<stdlib.h>#defineN3//运行程序输入测试时,可以把这个数组改小一些输入测试typedefstructstudent{intid;//学号charname[20];//姓名charsubject[20];//考......
  • ThreadLocal 的应用及原理
    1.是什么JDK对ThreadLocal类的描述为:此类提供线程局部变量。这些变量与普通变量的不同之处在于,每个访问一个变量的线程(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,这些字段希望将状态与线程(例如,用户ID或事务ID)相关联。......
  • aiohttp 异步爬虫实战
    想检测一下内网开放8080端口提供http服务的计算机,写了以下代码:#导入requests包importrequests,pathlib#发送请求defreq(ip):try:print(ip)r=requests.get(ip,timeout=0.5)ifr.status_code==200:......
  • python的threading模块
    线程线程被称为轻量级进程(LightweightProcess,LWP),是cpu调度的基本单位组成:线程ID、当前指令指针(PC)、寄存器集合、堆栈组成在单个程序中同时运行多个线程完成不同的工作,称为多线程。python中提供了thread和threading模块对线程进行操作,其中thread模块是比较底层的模块,threading模......
  • 多线程合集(三)---异步的那些事之自定义AsyncTaskMethodBuilder
    引言之前在上一篇文章中多线程合集(二)---异步的那些事,async和await原理抛析,我们从源码去分析了async和await如何运行,以及将编译后的IL代码写成了c#代码,以及实现自定义的Awaiter,自定义异步状态机同时将本系列的第一篇文章的自定义TaskScheduler和自定义的Awaiter......
  • Java开启异步的两种方式
    二、Java开启异步的两种方式1、注解开启:@Async1.1、配置异步的线程池必须配置异步线程池,否则异步不会生效。@EnableAsync注解:指定异步线程池。不指定默认使用:SimpleAsyncTaskExecutor线程池SimpleAsyncTaskExecutor是一个最简单的线程池,它没有任何的线程相关参数配置,它会为......
  • k8s下服务做threaddump和heapdump操作过程
    1. #查询节点的资源使用情况kubectl-nkjhs-yonyoutopnodes 2.#查询每个服务的资源使用情况kubectl-nkjhs-yonyoutoppod 3.#做theaddump和heapdump文件#找一个内存使用最大的服务,进入容器中做dump文件kubectl-nkjhs-yonyouexec-itf9667046-kjhs-yo......
  • ThreadLocal 和 InheritableThreadLocal 的区别
    结论:同一个ThreadLocal变量不能在子线程中获取到,而InheritableThreadLocal变量中的值可以在父子线程之间传递。例子:publicclassMain{privatestaticThreadLocal<String>threadLocal=newThreadLocal<>();privatestaticInheritableThreadLocal<String>i......
  • Airflow 设置Task优先级
    Airflow要设置Task的优先级,涉及到这2个配置1.weight_rule2.priority_weightweight_rule默认是downstream。还有其他2个配置upstream和absolutepriority_weight默认是1比如,下面的DAG1.weight_rule=downstreamtask优先级start5x12x22y11y212.weight_rule=upstreamtask优先级start1x12......