多线程与异步

多线程与异步

异步和多线程的区别

基于任务的异步编程模型 (TAP) 提供了异步代码的抽象化。 你只需像往常一样将代码编写为一连串语句即可。 就如每条语句在下一句开始之前完成一样,你可以流畅地阅读代码。 编译器将执行许多转换,因为其中一些语句可能会开始运行并返回表示正在进行的工作的 Task

这就是此语法的目标:支持读起来像一连串语句的代码,但会根据外部资源分配和任务完成时间以更复杂的顺序执行。 这与人们为包含异步任务的流程给予指令的方式类似。 在本文中,你将通过做早餐的指令示例来查看如何使用 asyncawait 关键字更轻松地推断包含一系列异步指令的代码。 你可能会写出与以下列表类似的指令来解释如何做早餐:

  1. 倒一杯咖啡。
  2. 加热平底锅,然后煎两个鸡蛋。
  3. 煎三片培根。
  4. 烤两片面包。
  5. 在烤面包上加黄油和果酱。
  6. 倒一杯橙汁。

如果你有烹饪经验,便可通过异步方式执行这些指令。 你会先开始加热平底锅以备煎蛋,接着再从培根着手。 你可将面包放进烤面包机,然后再煎鸡蛋。 在此过程的每一步,你都可以先开始一项任务,然后将注意力转移到准备进行的其他任务上。

做早餐是非并行异步工作的一个好示例。 单人(或单线程)即可处理所有这些任务。 继续讲解早餐的类比,一个人可以以异步方式做早餐,即在第一个任务完成之前开始进行下一个任务。 不管是否有人在看着,做早餐的过程都在进行。 在开始加热平底锅准备煎蛋的同时就可以开始煎了培根。 在开始煎培根后,你可以将面包放进烤面包机。

对于并行算法而言,你则需要多名厨师(或线程)。 一名厨师煎鸡蛋,一名厨师煎培根,依次类推。 每名厨师将仅专注于一项任务。 每名厨师(或线程)都在同步等待需要翻动培根或面包弹出时都将受到阻。

异步编程

异步方法的特征:

Async:方法签名中含有Async修饰符的方法就是异步方法。

await:1.暂停所在方法。待结束时继续。

​ 2.暂停的同时进程返回调用方

Task如果方法没有操作数的返回,则为Task

方法名称以Async结尾

留下一个问题await时有没有创建新的线程

参考资料:

使用 Async 和 Await 的异步编程

深入了解异步

.NET 中的并行编程

托管线程处理基本知识

.NET 中的并行处理、并发和异步编程

async修饰符

await 运算符

posted @ 2022-02-16 17:07  CCmonitor  阅读(73)  评论(0)    收藏  举报