在面向服务的系统中,各个子系统之间通常采用异步方式进行通信,例如订单系统与支付系统之间的通信,以及现实生活中你在餐厅点菜、下单、做事、上菜、吃饭的过程,这些都是异步的。异步的工作流可以同时进行,因此它能够提高效率。现在的扫码点餐就是一个很好的异步例子,它将顾客点餐与厨师制作菜品的过程分离,使得这两个过程可以同时进行,从而提高了效率。在同步的世界里,工作流简单易懂,但效率却非常低。
现代应用程序广泛使用文件和网络 I/O。I/O 相关 api 传统上默认是阻塞的,导致用户体验和硬件利用率不佳,此类问题的学习和编码的难度也较大。而今基于 Task 的异步 API 和语言级异步编程模式颠覆了传统模式,使得异步编程非常简单,几乎没有新的概念需要学习。
异步代码有如下特点:
使用 .NET 基于 Task 的异步模型可以直接编写 I/O 和 CPU 受限的异步代码。该模型围绕着Task和Task类型以及 C# 的async和await关键字展开。本文将讲解如何使用 .NET 异步编程及一些相关基础知识。
.NET Framework 提供了一个基于任务的异步模式 (TAP),它是构建异步操作的推荐方式。这种模式使用 System.Threading.Tasks.Task
和 System.Threading.Tasks.Task<TResult>
类来代表异步操作。这种模式不仅适用于 I/O 操作,还适用于那些可能会阻塞主线程的长时间运行的计算操作。通过使用 TAP,开发者可以编写出更加简洁、易于理解和维护的异步代码。
Task
类提供了一种方式来运行某些操作,并在操作完成时通知应用程序。对于无返回值的异步操作,使用 Task
类。Task
,代表有返回值的异步操作。TResult
是操作完成时返回的结果类型。async
和 await
关键字简化异步编程。标记为 async
的方法称为异步方法,这些方法中可以使用 await
关键字等待异步操作的完成,而不会阻塞调用线程。Task
或 Task<TResult>
的方法来启动异步操作。如果方法支持异步版本,它通常以 "Async" 结尾。await
关键字等待异步操作的完成,await
会暂停当前方法的执行,直到等待的 Task
完成,然后继续执行方法的剩余部分。期间,调用线程不会被阻塞,可以继续执行其他工作。注意:异步不能提高单一业务的速度。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!