首页 > 编程语言 >异步编程 async、await

异步编程 async、await

时间:2023-11-21 09:00:09浏览次数:43  
标签:异步 Task await 返回值 async 方法

1、使用async修饰符标记的方法称为异步方法

1) 异步方法的返回值一般是Task<T>,T是真正的返回值类型,Task<int>。惯例:异步方法名字以Async结尾。

2) 即使方法没有返回值,也最好把返回值声明为非泛型的Task。 

3) 调用泛型方法时,一般在方法前加上await关,这样拿到的返回值就是泛型指定的T类型;

4) 异步方法的“传染性”:一个方法中如果有await调用,则这个方法也必须修饰为async

2、async 方法的缺点

  • 异步方法会生成一个类,运行效率没有普通方法高;
  • 可能会占用非常多的线程;

3、异步方法使用注意

  优化:直接返回异步方法Task<T>,只是当成普通的方法调用,运行效率更高,不会造成线程浪费。

  禁用:异步方法Task<T>的 Wait()【无返回值】,Result()【有返回值】,存在死锁风险,尽量不用

 

  优化:await Task.Delay(毫秒数):延迟,不会卡主线程。【异步方法中暂停使用】

  禁用:Thread.Sleep(毫秒数):延迟,会阻塞主线程,降低并发。

  返回值为Task的不一定都要标注 async ,标注 async 只是让我们更方便 await 而已。

  如果一个异步方法只是对别的异步方法调用的转发,并没有太多复杂的逻辑(比如等待A的结果,在调用B,把A调用的返回值拿到内部做一些处理再返回),那么就可以去掉 async 关键字。

4、特殊处理

  有时需要提前终止任务比如:请求超时、用户取消请求。

  很多异步方法都有CancellationToken 参数,用于获得提前终止执行的信号。

  CancellationToken 结构体常用的内容

  • bool IsCancellationRequested 是否被取消
  • ThrowIfCancellationRequested() 如果异步任务被取消,执行这句话就抛异常。

  .Net Core开发中,一般不需要自己处理CancellationToken、CancellationTokenSource这些,只要做到"能转发CancellationToken就转发"即可。

标签:异步,Task,await,返回值,async,方法
From: https://www.cnblogs.com/SimpleTian/p/17843852.html

相关文章

  • 异步处理
    异步处理方式,如下代码ProcStatusChangeEvent<Supplier<Boolean>>eventSendMsg=newProcStatusChangeEvent<>(()->{//下方为业务代码,此处为发送短信例子this.sendMsg(assignee,noteById.getCreateId(),buffer.toString());......
  • Vue公共loading升级版(处理并发异步差时响应)
    公共loading是项目系统中很常见的场景,处理方式也不外乎三个步骤:1.通过全局状态管理定义状态值(vuex、pinia等)。2.在程序主入口监听状态值变化,从而展示/隐藏laoding动画。3.在请求和相应拦截器中变更状态值。第一二步骤处理大同小异,但在第三步中,网上很多博文分享的方法是:在请求......
  • Webman框架使用异步任务
    首先在app目录下创建Task.php<?phpnamespaceapp;useWorkerman\Connection\TcpConnection;classTask{/***只会执行一次*@returnvoid*/publicfunctiononWorkerStart(){echo"进程启动";}publicfunctiononMessage($connection,$task_data){$connect......
  • nodejs你应该知道的13个库 | Sequelize CORS Nodemailer Async Lodash Axios
    1.SequelizeSequelize是一种基于promise的Node.js对象关系映射器(ORM)使用,它使开发人员更容易使用关系数据库。 2.CORSCORS是一个Node.js包,它使用Connect/Express提供跨域资源共享(CORS)作为中间件。CORS包包装了Node.js路由中间件,允许程序从其自己的域以外的......
  • Spring异步机制:@Async
    概述当一个方法标注@Async注解时,该方法的调用将异步发生;这意味着调用者将在调用后立即返回,方法的实际执行将发生在提交给SpringTaskExecutor的任务中。示例示例1使用@EnableAsync注解启用异步机制@EnableAsync@ConfigurationpublicclassAsyncConfig{} @Service......
  • Flutter/Dart第21天:Dart异步编程(Future/Stream)
    Dart官方文档:https://dart.dev/language/async重要说明:本博客基于Dart官网文档,但并不是简单的对官网进行翻译,在覆盖核心功能情况下,我会根据个人研发经验,加入自己的一些扩展问题和场景验证。Future处理我们有2种方式编写Future异步代码:使用async和wait关键字使用FutureAPI(ht......
  • CreateCollection_dataSyncService_执行流程源码解析
    CreateCollection_dataSyncService_执行流程源码解析milvus版本:v2.3.2CreateCollection这个API流程较长,也是milvus的核心API之一,涉及的内容比较复杂。这里介绍dataSyncService相关的流程。这边文章基于【CreateCollection流程_addCollectionMetaStep_milvus源码解析】这篇文章......
  • 同时调用多个异步请求
    需求为了减少页面等待时间,现有多个接口,需要同时调用。解决有两种写法:Promise.all([interfaceName1(para1),interfaceName2(para2)]).then().catch()Promise.all(arr)中的参数arr:由接口名称(接口参数)组成的数组;then((res)=>{})中的结果res:接口结果所组成的数组。例1......
  • async 和 await 如何捕获异常
    前言之前代码写法中使用async和await,没有捕获异常,导致不满足code===200条件时,页面无法抛出错误,如下所示:async和awaitsubmitForm(){this.$refs["form"].validate(async(valid)=>{if(!valid)return;this.btnLoading=true;......
  • java中的异步任务处理和Feature接口
    简介Java并发包提供了一套框架,大大简化了执行异步任务所需要的开发。框架引入了“执行服务”的概念,封装了任务执行的细节,对任务提交者而言,他可以关注任务本身,如提交任务、获取结果、取消任务。而不用关注任务执行的细节。基本接口①Runnable和Callable:表示要执行的任务②Excecuto......