C#学习之在 C# 8 中使用 异步流
小职 2021-01-21 来源 :码农读书 阅读 97 评论 0

摘要:本文主要向大家介绍了C#学习之在 C# 8 中使用 异步流,通过具体的内容向大家展现,希望对大家C#的学习有所帮助。

本文主要向大家介绍了C#学习之在 C# 8 中使用 异步流,通过具体的内容向大家展现,希望对大家C#的学习有所帮助。

C#学习之在 C# 8 中使用 异步流

异步编程已经流行很多年了,.NET 引入的 async 和 await 关键词让异步编程更具有可读性,但有一个遗憾,在 C# 8 之前都不能使用异步的方式处理数据流,直到 C# 8 引入的 IAsyncEnumerable 才解决了这个问题。

 

说到 IAsyncEnumerable ,得先说一说 IEnumerable ,大家都知道,它是用同步的方式来迭代 collection 集合的,而这里的 IAsyncEnumerable 则是用异步方式,换句话说:IAsyncEnumerable 在迭代集合的过程中不会阻塞调用线程。

 

IAsyncDisposable, IAsyncEnumerable,  IAsyncEnumerator

 

异步流 允许我们可以用异步的方式处理数据,在这之前要了解下面三个接口:IAsyncDisposable, IAsyncEnumerable和 IAsyncEnumerator,他们都是在 .NET Standard 2.1 中被引入,下面的代码片段展示了这三个接口的定义。

 

public interface IAsyncDisposable

{

    ValueTask DisposeAsync();

}

 

public interface IAsyncEnumerable

{

    IAsyncEnumeratorGetAsyncEnumerator(CancellationToken

    token = default);

}

 

public interface IAsyncEnumerator: IAsyncDisposable

{

    ValueTaskMoveNextAsync();

    T Current { get; }

}

为什么要使用异步流

 

可以想象一下你有一个数据访问层需要从数据库中一次性读取所有的数据,要想使用这个功能很简单,可以直接调用 底层提供的异步方法 XXXAsyc 实现异步调用并且一次性返回所有数据。

 

只要不是将所有数据都呈现在页面上的话,这种解决方案问题不是太大,很多时候更多的是通过 分页读取 的形式,其实在这方面还有一个比较好的做法就是在数据可用时立即返回给调用者。

 

准确的说,这里可使用 异步流 的方式来解决,如果你的方法是同步返回的话,你可以使用 return yield + 返回值 IEnumerable 模式,很遗憾的是,这种方式没有扩展性,因为它是需要阻塞调用线程的。

 

最好的解决方案就是 return yield + 返回值 IAsyncEnumerable 模式,异步流方法返回的是 IAsyncEnumerable实例,并且可以包含一个或多个 yield return 语句。

 

在 C#8 中创建异步流

 

下面的代码片段展示了一个返回 Task

 

class Program

 {

     const int DELAY = 1000;

     const int MIN = 1;

     const int MAX = 10;

 

     public static async Task Main(string[] args)

     {

         foreach (int number in await GetData())

         {

             Console.WriteLine($"{DateTime.Now}: number={number}");

         }

 

         Console.ReadLine();

     }

 

     public static async Task<IEnumerable> GetData()

     {

         Listintegers = new List();

         for (int i = MIN; i <= MAX; i++)

         {

             await Task.Delay(DELAY);

             integers.Add(i);

         }

         return integers;

     }

 }

 C#学习之在 C# 8 中使用 异步流

 

当运行上面的应用程序,它会等待 10s 之后再将所有的 1-10 的数字输出控制台上,虽然这个 GetData 是异步的,但最终还是一次性输出了,而不是一个一个的隔秒输出。

 

这个时候可以让 yield 关键词介入,它是在 C# 2.0 中被引入的,常用于执行状态迭代 并且按一个一个的从集合中返回数据,你不需要像上面一样创建一个集合(integers) 再返回上去,下面的代码片段是修改 GetData 方法并且合并了 yield 关键词的版本,代码如下:

 

static async IAsyncEnumerableGetData()

{

   for (int i = MIN; i < MAX; i++)

   {

      yield return i;

      await Task.Delay(DELAY);   

   }

}

C#8 中使用异步流

 

要想使用异步流, 需要在 foreach 前增加一个 await 关键词,如下代码所示:

 

public static async Task Main(string[] args)

        {

            await foreach (int number in GetData())

            {

                Console.WriteLine($"{DateTime.Now}: number={number}");

            }

 

            Console.ReadLine();

        }

下面是完整的仅供参考的代码。

 

class Program

   {

       const int DELAY = 1000;

       const int MIN = 1;

       const int MAX = 10;

 

       public static async Task Main(string[] args)

       {

           await foreach (int number in GetData())

           {

               Console.WriteLine($"{DateTime.Now}: number={number}");

           }

 

           Console.ReadLine();

       }

 

       static async IAsyncEnumerableGetData()

       {

           for (int i = MIN; i < MAX; i++)

           {

               yield return i;

               await Task.Delay(DELAY);

           }

       }

   }

 

 C#学习之在 C# 8 中使用 异步流

C# 8 中一个非常重要的特性就是支持了 IAsyncEnumerable,它可以让你应用程序代码更干净,更高效 和 更高性能。


关注“职坐标在线”(Zhizuobiao_Online)公众号,免费获取学习教程资料、技术就业咨询

C#学习之在 C# 8 中使用 异步流

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    ICP许可  沪B2-20190160

站长统计