iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >C#中async和await有什么用
  • 832
分享到

C#中async和await有什么用

2023-06-20 13:06:11 832人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关C#中async和await有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言本文介绍async/Task。在学习该知识点过程中,一定要按照每一个示例,去写代码、执行、

这篇文章将为大家详细讲解有关C#中async和await有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

    前言

    本文介绍async/Task。在学习该知识点过程中,一定要按照每一个示例,去写代码、执行、输出结果,自己尝试分析思路。

    async

    微软文档:使用 async 修饰符可将方法、lambda 表达式或匿名方法指定为异步。

    使用 async 修饰的方法,称为异步方法。

    例如:

    为了命名规范,使用 async 修饰的方法,需要在方法名称后面加上 Async 。

    public async Task<int> TestAsync()  {      // . . . .  }Lambda :        static void Main()        {            Thread thread = new Thread(async () =>            {                await Task.Delay(0);            });        }        public static async Task<int> TestAsync() => 666;

    await

    微软文档:await 运算符暂停对其所属的 async 方法的求值,直到其操作数表示的异步操作完成。

    异步操作完成后,await 运算符将返回操作的结果(如果有)。

    好的,到此为止,async 和 await ,在官方文档中的说明,就这么多。

    从以往知识推导

    这里我们不参考文档和书籍的资料,不要看文档和书籍中的示例,我们要一步步来从任务(Task)中的同步异步开始,慢慢摸索。去分析 async 和 await 两个关键字给我们的异步编程带来了什么样的便利。

    创建异步任务

    场景:周六日放假了,可以打王者(一种游戏),但是昨天的衣服还没有洗;于是用洗衣机洗衣服,清洗期间,开一局王者(一种游戏)。

    我们可以编写一个方法如下:

    static void Main()        {            Console.WriteLine("准备洗衣服");            // 创建一个洗衣服的任务            Task<int> task = new Task<int>(() =>            {                // 模拟洗衣服的时间                int time = new Random().Next(2, 6);                Thread.Sleep(TimeSpan.FromSeconds(time));                return time;            });            Console.WriteLine("开始洗衣服");            // 让洗衣机洗衣服            task.Start();            Console.WriteLine("我去打王者,让洗衣机洗衣服");            // 打王者            Thread.Sleep(TimeSpan.FromSeconds(4));            Console.WriteLine("打完王者了,衣服洗完了嘛?");            Console.WriteLine(task.IsCompleted);            if (task.IsCompleted)                Console.WriteLine("洗衣服花的时间:" + task.Result);            else            {                Console.WriteLine("在等洗衣机洗完衣服");                task.Wait();                Console.WriteLine("洗衣服花的时间:" + task.Result);            }            Console.WriteLine("洗完了,捞出衣服,晒衣服,继续打王者去");        }

    创建异步任务并返回Task

    上面的示例,虽然说,异步完成了一个任务,但是这样,将代码都放到 Main ,可读性十分差,还要其它什么规范之类的,不允许我们写这样的垃圾代码。于是我们将洗衣服这个任务,封装到一个方法中,然后返回 Task 即可。

    在 Program 类中,加入如下一个方法,这个方法用于执行异步任务,并且返回 Task 对象。

    /// <summary>        /// 执行一个任务        /// </summary>        /// <returns></returns>        public static Task<int> TestAsync()        {            Task<int> task = new Task<int>(() =>            {                // 模拟洗衣服的时间                int time = new Random().Next(2, 6);                Thread.Sleep(TimeSpan.FromSeconds(time));                return time;            });            task.Start();            return task;        }

    Main 方法中,改成

    static void Main()        {            Console.WriteLine("准备洗衣服");            // 创建一个洗衣服的任务            Task<int> task = TestAsync();            ... ...

    但是,两者差别还是不大。

    异步改同步

    我们创建了异步方法,去执行一个洗衣服的任务;当打完游戏后,需要检查任务是否完成,然后才能进行下一步操作,这时候就出现了 同步。为了保持同步和获得执行结果,我们使用了 .Wait() 、.Result 。

    这里我们尝试将上面的操作转为同步,并且获得执行结果。

    class Program    {        static void Main()        {            int time = Test();            // ... ...        }        /// <summary>        /// 执行一个任务        /// </summary>        /// <returns></returns>        public static int Test()        {            Task<int> task = new Task<int>(() =>            {                // 模拟洗衣服的时间                int time = new Random().Next(2, 6);                Thread.Sleep(TimeSpan.FromSeconds(time));                return time;            });            task.Start();            return task.Result;        }    }

    说说 await Task

    Task 和 Task<TResult> ,前者是一个没有返回结果的任务,后者是有返回结果的任务。前面的文章中已经使用过大量的示例,这里我们使用 await ,去完成一些完全相同的功能。

    Task:

    public static void T1()        {            Task task = new Task(() => { });            task.Wait();        }
    public static async void T2()        {            Task task = new Task(() => {  });            await task;        }

    说明,await 可以让程序等待任务完成。

    Task<TResult>:

       public void T3()       {           // 获取 Task 任务对象,后面的逻辑过程可以弄成异步           Task<int> task = TestAsync();           // 任务是异步在执行,我不理会他           // 这里可以处理其它事情,处理完毕后,再获取执行结果           // 这就是异步           Console.WriteLine(task.Result);       }
    public async void T4()        {            // 使用 await 关键字,代表等待执行完成,同步            int time = await TestAsync();            Console.WriteLine(time);        }

    说明:await 可以让程序等待任务执行完成,并且获得执行结果。

    看到没有。。。await 关键字,作用是让你等,是同步的,压根不是直接让你的任务变成异步后台执行的。

    那为啥提到 async 、await,都是说跟异步有关?不急,后面解释。

    说说 async Task<TResult>

    async Task<TResult> 修饰一个方法,那么这个方法要返回 await Task<TResult> 的结果。

    C#中async和await有什么用

    两种同步方式示例对比:

    public static int Test()        {            Task<int> task = new Task<int>(() =>            {                // 模拟洗衣服的时间                int time = new Random().Next(2, 6);                Thread.Sleep(TimeSpan.FromSeconds(time));                return time;            });            task.Start();            return task.Result;        }
    public static async Task<int> TestAsync()        {            Task<int> task = new Task<int>(() =>            {                // 模拟洗衣服的时间                int time = new Random().Next(2, 6);                Thread.Sleep(TimeSpan.FromSeconds(time));                return time;            });            task.Start();            int time = await task;            return time;        }

    同步异步?

    问:async 和 await 不是跟异步方法有关嘛,为啥前面的示例使用了 await ,全部变成同步了?

    问:使用 async 和 await 的方法,执行过程到底是同步还是异步?

    答:同步异步都行,要同步还是异步,全掌握在你的手上。

    • 你使用 await 去调用一个异步方法,其执行过程就是同步。

    • 你获取异步方法返回的 Task,就是异步。

    最近笔者收到一些提问,有些读者,使用 async 和 await 去编写业务,想着是异步,可以提升性能,实际结果还是同步,性能一点没有提升。通过下面的示例,你会马上理解应该怎么用。

    首先,在不使用 async 和 await 关键字的情况下,我们来编写两个方法,分别实现同步和异步的功能,两个方法执行的结果是一致的。

    /// <summary>        /// 同步        /// </summary>        /// <returns></returns>        public static int Test()        {            Task<int> task = new Task<int>(() =>            {                return 666;            });            task.Start();            return task.Result;        }                /// <summary>        /// 异步        /// </summary>        /// <returns></returns>        public static Task<int> TestAsync()        {            Task<int> task = new Task<int>(() =>            {                return 666;            });            task.Start();            return task;        }

    能不能将两个方法合并在一起呢?想同步就同步,想异步就异步,这样就不需要写两个方法了!

    是可以的!通过 async 和 await 关键字,可以轻松实现!

    合并后,代码如下:

    /// <summary>        /// 可异步可同步        /// </summary>        /// <returns></returns>        public static async Task<int> TestAsync()        {            Task<int> task = new Task<int>(() =>            {                return 666;            });            task.Start();            return await task;        }

    合并后,我们又应该怎么在调用的时候,实现同步和异步呢?

    笔者这里给出两个示例:

    // await 使得任务同步        public async void T1()        {            // 使用 await 关键字,代表等待执行完成,同步            int time = await TestAsync();            Console.WriteLine(time);        }        // 直接获得返回的 Task,实现异步        public void T2()        {            // 获取 Task 任务对象,后面的逻辑过程可以弄成异步            Task<int> task = TestAsync();            // 任务是异步在执行,我不理会他            // 这里可以处理其它事情,处理完毕后,再获取执行结果            // 这就是异步            Console.WriteLine(task.Result);        }

    至此,理解为什么使用了 async 和 await,执行时还是同步了吧?

    Task封装异步任务

    前面,我们都是使用了 new Task() 来创建任务,而且微软官网大多使用 Task.Run() 来编写 async 和 await 的示例。

    因此,我们可以修改前面的异步任务,改成:

    /// <summary>        /// 可异步可同步        /// </summary>        /// <returns></returns>        public static async Task<int> TestAsync()        {            return await Task.Run<int>(() =>            {                return 666;            });        }

    关于跳到 await 变异步

    在百度学习异步的时候,往往会有作者说,进入异步方法后,同步执行代码,碰到 await 后就是异步执行。

    当然还有多种说法。

    我们已经学习了这么多的任务(Task)知识,这一点十分容易解释。

    因为使用了 async 和 await 关键字,代码最深处,必定会出现 Task 这个东西,Task 这个东西本来就是异步。碰到 await 出现异步,不是因为 await 的作用,而是因为最底层有个 Task。

    C#中async和await有什么用

    为什么出现一层层的 await

    这是相对于提供服务者来说。因为我要提供接口给你使用,因此底层出现 async、await 后,我会继续保留方法是异步的(async),然后继续封装,这样就有多层的调用结构,例如上一小节的图。

    但是如果来到了调用者这里,就不应该还是使用 async 、await 去编写方法,而是应该按照实际情况同步或异步。

    关于“C#中async和await有什么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

    --结束END--

    本文标题: C#中async和await有什么用

    本文链接: https://www.lsjlt.com/news/296792.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C#中async和await有什么用
      这篇文章将为大家详细讲解有关C#中async和await有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言本文介绍async/Task。在学习该知识点过程中,一定要按照每一个示例,去写代码、执行、...
      99+
      2023-06-20
    • async和await有什么用
      这篇文章将为大家详细讲解有关async和await有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。来看一个简单的场景://假设有4个异步方法要按顺序调用new Pr...
      99+
      2024-04-02
    • es6中await和async有哪些作用
      今天小编给大家分享一下es6中await和async有哪些作用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们...
      99+
      2024-04-02
    • async和await怎么使用
      本篇内容介绍了“async和await怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Eric:如何讲清楚Promiseasync和a...
      99+
      2023-06-03
    • JavaScript Promise与async、await有什么作用
      这篇文章主要介绍“JavaScript Promise与async、await有什么作用”,在日常操作中,相信很多人在JavaScript Promise与async、await有什么作用问题上存在疑惑,小编查阅了各式资...
      99+
      2023-07-05
    • C#中async和await的深入分析
      目录大概理解深入分析await和Wait()的区别去掉Task.Run的Wait小结其他.Await();总结大概理解 查了一个小时的资料:async和await 发现这个大神的解释...
      99+
      2022-11-13
      c# async和await c#异步编程
    • async await的用法是什么
      async/await 是 JavaScript 中用于处理异步操作的关键字组合。async 关键字用于声明一个函数是异步函数,该函...
      99+
      2023-10-07
      async
    • 一篇文章弄懂C#中的async和await
      目录前言 async await 从以往知识推导 创建异步任务 创建异步任务并返回Task 异步改同步 说说 await Task 说说 async Task<TResult&...
      99+
      2024-04-02
    • Javascript中promise,async和await的区别是什么
      本文小编为大家详细介绍“Javascript中promise,async和await的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Javascript中promise,async和await的区别是什么”文章能帮助大家解决疑惑...
      99+
      2023-06-29
    • C#使用async和await实现异步编程
      最近在写程序的时候,经常遇到大量需要异步访问的情况,但是对于async和await到底怎么写,还不是非常明确。 1.普通的程序怎么写? class Program { sta...
      99+
      2024-04-02
    • React应用怎么使用Async和Await
      这篇文章主要介绍“React应用怎么使用Async和Await”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React应用怎么使用Async和Await”文章能帮助大家解决问题。Async/Awai...
      99+
      2023-06-05
    • JavaScript中async,await的使用和方法
      JS中 async函数和await 关键字 function hellworld() { return "您好!美好世界!"; } console.log...
      99+
      2024-04-02
    • js中怎么用async和await实现同步
      这篇“js中怎么用async和await实现同步”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“js中怎么用async和awa...
      99+
      2023-06-29
    • C#怎么使用async和await实现异步编程
      这篇文章主要介绍“C#怎么使用async和await实现异步编程”,在日常操作中,相信很多人在C#怎么使用async和await实现异步编程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么使用async...
      99+
      2023-07-02
    • C#5.0中的异步编程关键字async和await
      一、Asynchronous methods 异步方法 .NET 4.5 的推出,对于C#又有了新特性的增加——就是C#5.0中async和await两个关键...
      99+
      2024-04-02
    • vue中async-await如何使用
      本篇文章为大家展示了vue中async-await如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。曾经见过为了让钩子函数的异步代码可以同步执行,而对钩子函数使...
      99+
      2024-04-02
    • C#多线程系列之async和await用法详解
      目录async和awaitasyncawait从以往知识推导创建异步任务创建异步任务并返回Task异步改同步说说 await Task说说 async Task<TR...
      99+
      2024-04-02
    • NodeJs中怎么使用async和await处理异步
      NodeJs中怎么使用async和await处理异步,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。场景远古时代我们在编写exp...
      99+
      2024-04-02
    • Node.js中async和await关键字如何使用
      本篇内容主要讲解“Node.js中async和await关键字如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中async和await关键字如何使用”吧!async 和 aw...
      99+
      2023-07-02
    • C#异步编程之async/await怎么使用
      今天小编给大家分享一下C#异步编程之async/await怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。概述异步这个...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作