c# 学习笔记 - 异步编程

这篇具有很好参考价值的文章主要介绍了c# 学习笔记 - 异步编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 异步编程介绍

1.1 简单介绍

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

文章来源地址https://www.toymoban.com/news/detail-802476.html

1.2 async/await 使用

  细节注意

  1. async 用来修饰方法,表示这个方法可以成为一个异步方法,但是如果内部没有搭配使用 await 关键字的话其作用还是等效于一个同步方法
  2. await 关键字必须用于在 async 修饰的异步方法内使用,await 的作用就是立即返回调用方法的结果,外部调用该 async 方法的地方将不会等待这个 await 关键字修饰 方法/其他延时 操作的完成。但这个async 异步方法内,下面的操作还是必须要等待这个 await 关键字修饰 方法/其他延时 操作的完成.
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对象来保存正在运行的任务, 可以使用这个对象来保存一个正在运行的任务.
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 关键字将会阻塞异步操作的执行,必须等待所有前缀步骤完成后,再完成接下来的步骤

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 所规定的方法)

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关键字

到了这里,关于c# 学习笔记 - 异步编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c#异步编程

    1.创建任务的几种方法 2.c#Task 常用的方法 在C#中,Task类是用于表示异步操作的重要类,它提供了许多用于管理和处理异步操作的方法。以下是Task类中常用的方法: Task.Run :创建并启动一个新的任务,该任务在后台线程上执行指定的操作。 Task.Delay :创建一个在指定时间后完

    2024年02月21日
    浏览(31)
  • Java学习笔记-day06-响应式编程Reactor与Callback、CompletableFuture三种形式异步编码对比

    Reactor 是一个基于Reactive Streams规范的响应式编程框架。它提供了一组用于构建异步、事件驱动、响应式应用程序的工具和库。Reactor 的核心是 Flux (表示一个包含零到多个元素的异步序列)和 Mono 表示一个包含零或一个元素的异步序列)。 Reactor 通过提供响应式的操作符,如

    2024年02月03日
    浏览(33)
  • C#异步编程:原理与实践

    一、引言 在现代应用程序开发中,尤其是在涉及I/O操作(如网络请求、文件读写等)时,异步编程成为了提高性能和用户体验的关键技术。C#作为.NET框架下的主流开发语言,提供了强大的异步编程支持,通过async/await,可以让开发者以同步的方式编写异步代码,极大地

    2024年03月18日
    浏览(36)
  • C# BeginInvoke实现异步编程

    C# BeginInvoke实现异步编程-CSDN博客 https://blog.csdn.net/Nire_Yeyu/article/details/133203267   C# BeginInvoke实现异步编程 BeginInvoke实现异步编程的三种模式: 1.等待模式 在发起了异步方法以及做了一些其他处理之后,原始线程就中断并且等异步方法完成之后再继续; eg: using System; using Sys

    2024年02月08日
    浏览(33)
  • C# 消息队列、多线程、回滚、并行编程、异步编程、反射

    消息队列是一种在应用程序之间传递消息的异步通信机制。它可以使应用程序解耦并提高系统的可伸缩性和可靠性。在 C# 中,你可以使用多个消息队列技术,其中一种广泛使用的技术是 RabbitMQ。 RabbitMQ 是一个开源的消息代理,实现了高级消息队列协议(AMQP),提供了强大的

    2024年01月17日
    浏览(31)
  • C# 中的多线程和异步编程

    最近在看代码的过程中,发现有很多地方涉及到多线程、异步编程,这是比较重要且常用的知识点,而本人在这方面还理解尚浅,因此开始全面学习C#中的多线程和异步编程,文中部分内容摘抄自一位前辈的网站:网址链接,为了更便于理解和学习,本人还在个别地方做了一

    2023年04月08日
    浏览(36)
  • 【学习笔记】C#基础 - 由C/C++衍生出来的面向对象的编程语言

    1、基本语法 2、类的命名 必须以 A-Z / _ / @ 开头,不能是数字,之后可以跟 A-Z 、 0-9 、 _ 、 @ 不能包含任何空格或特殊符号,比如 ?-+!#%^*()[]{}.;:\\\"\\\'/ 不能与同名(除非添加 @ 前缀,@不作为标识符本身的一部分),不能与类库同名 必须区分大小写(PascalCase命名法) 3、关

    2024年02月07日
    浏览(43)
  • Unity3D高级编程主程手记 学习笔记二:C#技术要点

    1.Untiy3D中C#的底层原理 Unity底层在运行C#程序时有两种机制:一种是Mono,另一种是IL2CPP。 Mono存在的目的是为了跨平台 ,因为最初C#只支持Windows。而IL可以看成是一种汇编语言且完全基于堆栈,必须运行在虚拟机上。也就是说C#会被编译器编译成IL,当需要他们时就会被实时的

    2024年02月08日
    浏览(43)
  • Unity中的异步编程【5】——在Unity中使用 C#原生的异步(Task,await,async) - System.Threading.Tasks

    1、System.Threading.Tasks中的Task是.Net原生的异步和多线程包。 2、UniTask(Cysharp.Threading.Tasks)是仿照.Net原生的Task,await,async开发的一个包,该包专门服务于Unity,所以取名UnityTask,简称UniTask。 3、既然有Task了,为啥还要搞一个UniTask (1)Task可以用在PC和Android上,但是在WebGL上则会

    2023年04月17日
    浏览(38)
  • C#学习(十三)——多线程与异步

    程序执行的最小单元 一次页面的渲染、一次点击事件的触发、一次数据库的访问、一次登录操作都可以看作是一个一个的进程 在一个进程中同时启用多个线程并行操作,就叫做多线程 由CPU来自动处理 线程有运行、阻塞、就绪三态 代码示例: 运行结果为 可以看到,在结果中

    2024年02月19日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包