这是异步编程课程的一系列笔记,课程地址:Asynchronous Programming in C# and .NET Core

什么是异步编程

同步程序中的代码运行在单一线程上。

异步操作:从其它线程发起后,在一个新的单独线程上运行的操作。发起异步操作的线程不必等待异步操作完成。

为什么使用异步编程

对于需要长时间运行的操作,异步编程可以更大限度更有效地利用设备资源。

  • 通过异步执行 CPU 或 I/O 绑定操作,提高 UI 程序的响应性

  • 并行计算

什么时候使用异步编程

异步适用于 CPU 绑定或 I/O 绑定操作,例如:

  • I/O 从网络检索数据

  • CPU 密集操作,例如使用大量数据进行科学计算

  • I/O 读写硬盘

最适合应用异步编程的程序

  • 桌面 UI 程序

    • WinForms

    • WPF

    • UWP

  • Web Server 程序

Web Server 虽然不必与 UI 进行交互,但经常需要进行远程的数据库查询或计算分析大量数据,这些任务的执行时长都不算短。而作为 Web Server 又难免同时处理来自多个客户端的请求,这时引入异步编程可以避免先过来的请求发起的线程还在等待执行某些操作,后面的请求又来一大堆直接淹没了 WebServer,导致性能降低和延迟升高。

异步编程不是万能的

不要无脑使用异步,有些问题异步也无法解决,而且异步本身也会带来一些问题:

  1. 异步代码自身不带来任何的性能提升。它只让资源管理更高效

  2. 异步代码给程序带来更大的开销

  3. memory overhead:每个线程启动时要占用设备的虚拟内存

  4. scheduler overhead:调度程序开销,操作系统需要管理该在哪个 CPU 执行哪个线程以及何时执行

  5. 如果你不是 UI 程序,而且你代码里面也没有网络或 I/O 绑定操作,异步对你基本没什么增益

  6. 如果你的程序是 CPU-bound,使用多线程技术(module 2)好过使用异步编程