c# 学习笔记 - 异步编程

文章目录

    • [1. 异步编程介绍](#1. 异步编程介绍)
      • [1.1 简单介绍](#1.1 简单介绍)
      • [1.2 async/await 使用](#1.2 async/await 使用)
      • [1.3 Task/Task<TResult> 对象](#1.3 Task/Task 对象)
    • [2. 样例](#2. 样例)
      • [2.1 迅速启动所有任务,仅当需要结果才等待任务执行](#2.1 迅速启动所有任务,仅当需要结果才等待任务执行)
      • [2.2 使用 await 调用异步方法,即使这个异步方法内有 await 也不会同时执行回调和向下执行操作(必须完成外层await 所规定的方法)](#2.2 使用 await 调用异步方法,即使这个异步方法内有 await 也不会同时执行回调和向下执行操作(必须完成外层await 所规定的方法))
    • [3. 补充拓展说明](#3. 补充拓展说明)
      • [3.1 Task关键字](#3.1 Task关键字)

1. 异步编程介绍

1.1 简单介绍

**  异步编程官方参考文档:异步编程**

1.2 async/await 使用

**  细节注意**

  1. async 用来修饰方法,表示这个方法可以成为一个异步方法,但是如果内部没有搭配使用 await 关键字的话其作用还是等效于一个同步方法
  2. await 关键字必须用于在 async 修饰的异步方法内使用,await 的作用就是立即返回调用方法的结果,外部调用该 async 方法的地方将不会等待这个 await 关键字修饰 方法/其他延时 操作的完成。但这个async 异步方法内,下面的操作还是必须要等待这个 await 关键字修饰 方法/其他延时 操作的完成.
csharp 复制代码
class Program {
    static void Main(string[] args) {
        Console.WriteLine("This is methof(Main) starting ...");
        Test();
        Console.WriteLine("This is methof(Main) ending ...");
        Console.ReadLine();
    }

    static async void Test() {
        Console.WriteLine("This is methof(Test) starting ...");
        // 立即返回Test函数运行结果,继续Main函数运行. 并且同时将会进行延时操作后再继续下面的方法.
        await Task.Delay(3000); 
        Console.WriteLine("This is methof(Test) ending ...");
    }

}
/*
This is methof(Main) starting ...
This is methof(Test) starting ...
// await Task.Delay(3000); 返回主线程运行 + 当前Test()方法此位置暂停运行3s
This is methof(Main) ending ... 
This is methof(Test) ending ...
*/

1.3 Task/Task 对象

**  简单说明**

  1. 使用Task或Task对象来保存正在运行的任务, 可以使用这个对象来保存一个正在运行的任务.
csharp 复制代码
class Program {
    static void Main(string[] args) {
        Task<int> task = Task.Run(() => {
            Console.WriteLine("Hello world ..");
            return 2024;
        });

        int sum = task.Result;
        Console.WriteLine(sum);
    }
}
/*
Hello world ..
2024
*/

2. 样例

2.1 迅速启动所有任务,仅当需要结果才等待任务执行

假设我们需要完成打游戏 5s,我们也需要完成听歌曲 5s,最后我们需要去洗个澡 3s. 我们想要异步完成打游戏和听歌曲的操作,但是洗澡必须先完成打游戏和听歌曲两个步骤.

  您可以立即启动所有异步任务。仅当您需要结果时才等待每个任务,借助 await 关键字,await 关键字将会阻塞异步操作的执行,必须等待所有前缀步骤完成后,再完成接下来的步骤

csharp 复制代码
class Program {
    static void Main(string[] args) {
        Test();
        Console.WriteLine("This is Main Finish  .....");
        Console.ReadLine();
    }

    static async void Test() {
        Task t1 = playGameAsync();
        Task t2 = listenMusicAsync();

        await t1;
        await t2; // await 关键字表示必须等待这两个方法完成才能继续接下来的洗澡操作
        Console.WriteLine("i am washing right now ...");
    }

    static async Task playGameAsync() {
        await Task.Run(() => {
            Console.WriteLine("I am play game ..");
            Task.Delay(5000).Wait();
        });
        Console.WriteLine("i am finish play game");
    }

    static async Task listenMusicAsync() {
        await Task.Run(() => {
            Console.WriteLine("I am listen music ..");
            Task.Delay(5000).Wait();
        });
        Console.WriteLine("i am finish listen music");
    }
}
/*
I am play game ..
I am listen music ..
This is Main Finish  ..... // 这个地方的原因
(这个地方将会明显等待 5s, 洗澡操作必须等待听音乐和游戏操作先完成)
i am finish play game
i am finish listen music
i am washing right now ...
*/

2.2 使用 await 调用异步方法,即使这个异步方法内有 await 也不会同时执行回调和向下执行操作(必须完成外层await 所规定的方法)

csharp 复制代码
class Program {
    static void Main(string[] args) {
        Test(); // 同步方法调用异步方法,碰到了异步方法内的 await( await playGameAsync() ) 就会回调执行
        Console.WriteLine("This is Main Finish  .....");
        Console.ReadLine();
    }

    static async void Test() {
        await playGameAsync(); // 这里不会因为 playGameAsync() 方法内有await就回调执行, 必须等待异步方法playGameAsync()执行完全.
        Console.WriteLine("==========================================================");
        Console.WriteLine("i am washing right now ...");
    }

    static async Task playGameAsync() {
        await Task.Run(() => {
            Task.Delay(3000).Wait();
            Console.WriteLine("I am play game ..");
        });
        Task.Delay(3000).Wait();
        Console.WriteLine("i am finish play game");

    }

}
/*
This is Main Finish  .....(等待3s)
I am play game ..
i am finish play game  (明显发现 finish play game 的输出顺序会优先于 ====== )
==========================================================
i am washing right now ...
*/

3. 补充拓展说明

3.1 Task关键字

相关推荐
M78佐菲4 分钟前
ARM学习笔记(五)
linux·arm开发·笔记·嵌入式硬件·学习
志尊宝17 分钟前
Vue3 零基础每日笔记(052):路由常见坑一次排雷——404、刷新丢参数、部署白屏
前端·javascript·vue.js·笔记·html5
05664632 分钟前
用大模型构建答疑机器人:从 API 调用到上下文工程
python·学习·agent
我爱cope36 分钟前
【操作系统 | 开篇:什么是操作系统?从裸机到多任务系统】
学习·操作系统
Ztt6666666661 小时前
一抹霞红停在圆肩壶上,留白让颜色更醒目
经验分享·笔记·其他·百度·微信公众平台
迪丽热爱2 小时前
多媒体应用18-901(补)
学习
何以解忧唯有撸码2 小时前
【开源】c#造个轮子-日程安排工具
c#·自定义控件
摇滚侠2 小时前
《Spring Boot 3:高级与架构设计》第 2 章 IOC容器的高级机制 Environment 个人理解 4
java·spring boot·笔记·后端
周杰伦fans2 小时前
CAD菜单栏和工具栏都不见了,怎么显示?
其他·c#
曹牧2 小时前
C#:HashSet<T> 去重
c#