.net core异步编程 C# async/await Task

2025-12-13 0 385

一、概念

异步编程是一种并发编程模型,用于在应用程序中处理长时间运行的操作,以避免阻塞线程,提高应用程序的性能和响应能力。

同步:叫服务员点餐

异步:手机扫码点餐

服务器能同时服务的请求数量有限

增加并发量

为什么要使用:

1、异步编程并不是适用于所有场景。它主要适用于需要处理耗时操作、IO 操作或网络请求的情况,以避免阻塞主线程。

2、使用异步编程可以将这些耗时的操作放在后台线程或线程池中执行.,使主线程保持响应性,提高应用程序的用户体验。

3、提高并发性和吞吐量:通过异步编程,可以并发执行多个耗时操作,从而提高系统的并发性和吞吐量。

4、资源的高效利用:在同步编程中,当一个线程被阻塞等待操作完成时,它仍然会占用系统的线程资源。而异步编程利用了异步任务的特性,可以更好地利用系统的线程资源,提高系统的资源利用效率。

二、C#关键字 async 、await

异步方法:用async修饰

1、返回值一般是 Task<T>

2、无返回值,用非泛型的Task

3、调用泛型方法,方法前加上await,得到返回值 为<T>类型

4、传染性:方法中有await 调用 ,该方法修饰必须为asyns

5、调用某方法 返回值为Task,方法前加上await

6、!!! await(等待) 是同步方式写异步方法

用 Task t = …Async() 就是异步方法

7、只要 类里面有 GetAwaiter() 就可以await

.net core异步编程 C# async/await Task

.net core异步编程 C# async/await Task

1、调用异步方法

.net core异步编程 C# async/await Task

不加 await 没写完 就开始读

加 await 写完了 才开始读 (等待一下)

2、编写异步方法

.net core异步编程 C# async/await Task

3.当无法使用await:
 string filename = @\"H:\\a\\1.txt\";
   string s = await File.ReadAllTextAsync(filename);
//等价
   Task<string> t = File.ReadAllTextAsync(filename);
      string s = t.Result;

  await File.WriteAllTextAsync(filename, \"async hello\");
//等价
  Task t=File.WriteAllTextAsync(filename, \"async hello\");
  t.Wait();

当我们在回调方法中使用到了异步方法,但是回调方法貌似不支持async await的写法

有2中方式

Task.Result 和 Task.GetAwaiter.GetResult()

其实这两个使用方式是差不多的。不过,还是有一点小小的区别的:如果任务失败,Task.GetAwaiter().GetResult()会直接抛出异常,而Task.Result则会把异常包装在AggregateException中。从这个角度说Task.GetAwaiter().GetResult()要优于Task.Result。毕竟它少了异常的包装操作,即直接抛出异常,而不是把异常包装在AggregateException中。

4.委托异步

.net core异步编程 C# async/await Task

5.原理!

await、async 是“语法糖”,最终编译为“状态机调用”

总:

1、async的方法会被C#编译器编译成一个类,会主要根据await调用进行切分为多个状态,对async方法的调用会被拆分为对MoveNext的调用。

用await看似是“等待”,经过编译后,其实没有“wait”。

2、就是拆成多块,然后按顺序执行

6、async 背后的线程切换

1、遇到Await关键字,线程不会等着阻塞线程

2、Await调用 之前和之后线程不同(.net 会将现在线程放回线程池 等调用完后再 取一个线程 )

3、具体线程=服务员 线程可以得到充分利用

4、内容写入很少 ,线程不变

7、异步方法不等于多线程

异步编程和多线程是两种不同的编程模型,它们有以下区别:

  1. 执行方式:在多线程编程中,任务通常由多个线程并发执行,每个线程独立执行任务,并且可以同时执行多个任务。而在异步编程中,任务的执行不一定需要依赖于线程,可以通过异步操作和回调机制实现任务的并发执行。
  2. 线程数量:在多线程编程中,我们需要显式地创建和管理多个线程,每个线程负责执行一个任务。而在异步编程中,任务的执行可以在一个或多个线程上进行,具体的线程管理和调度由底层的异步框架来处理,我们不需要显式地管理线程。
  3. 阻塞与非阻塞:在多线程编程中,线程执行任务时可能会出现阻塞,即一个线程在等待某个操作完成时会被挂起,等待操作完成后再继续执行。而在异步编程中,通过异步操作和回调机制,任务的执行可以是非阻塞的,即可以在等待操作完成时继续执行其他任务,而不必一直等待。
  4. 内存消耗:多线程编程中,每个线程都需要占用一定的内存资源,线程的创建和销毁也会带来一定的开销。而在异步编程中,由于任务的执行可以复用线程或者利用线程池,可以更有效地利用系统的资源,减少了线程创建和销毁的开销,从而节省了内存消耗。

总的来说,异步编程强调的是任务的并发执行和非阻塞操作,能够提高系统的响应性和并发性,减少资源的消耗。而多线程编程则更加注重于并行执行多个任务,利用多个线程来提高系统的处理能力。异步编程和多线程可以结合使用,例如在多线程环境下使用异步操作来提高任务的并发性和效率。

8、没有async的异步方法!!!

.net core异步编程 C# async/await Task

async方法缺点:

1、异步方法会生成一个类,运行效率没有普通方法高;

2、可能会占用非常多的线程;

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

9、不要用sleep() 等待

因为它会阻塞当前线程!降低并发!

不用Thread.Sleep(3000);

用 await Task.Delay(3000);

10、CancellationToken参数,用于获取提前终止执行的信号 异步中止
1、CancellationToken 结构体

None:空

bool isCancellationRequested 是否取消

ThrowlfCancellationRequested() 如果任务被取消,执行到这句话就抛异常

2、CancellationTokenSource 类

CancelAfter()超时后发出取消信号

Cancel() 发出取消信号

3、CancellationToken cancellationToken参数

4、手动程序中止

.net core异步编程 C# async/await Task

5、总结:方法里面有CancellationToken参数 记得带上!

比如控制器中api 可以自己加

.net core异步编程 C# async/await Task

11、WhenAll

等待 多个Task 异步执行 完成后进行操作

.net core异步编程 C# async/await Task

.net core异步编程 C# async/await Task

三、其他

1、对于接口中的方法或者抽象方法不能修饰为async

2、异步与yield:可以让数据处理“流水线化”,提升性能

 static IEnumerable<string> Test1() {
      List<string> list = new List<string>();
      list.Add(\"hello\");
      list.Add(\"xw\");
      return list;
    }

    static IEnumerable<string> Test2()
    {
      //一步取数据 一返回
      yield return \"HELLO\";
      yield return \"xw\";
    }
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 .net core异步编程 C# async/await Task https://www.zuozi.net/36653.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务