C# 8 新特性 - 异步流 Asynchronous Streams

异步流 Asynchronous Streams

例子 

640?wx_fmt=png

这是一个很简单的控制台程序。它有一个NumberFactory,它可以根据传递的参数来产生一串数字(IEnumerable<int>)。然后在这个程序中把每个数字都打印出来,同时在前边显示出当前的线程ID。 

 

这里面的NumberFactory也是非常的简单: 

640?wx_fmt=png

这里我做了延迟,模拟读取外部资源的效果。 

 

运行程序(文章考不到挨个输出的停顿效果): 

640?wx_fmt=png

 

640?wx_fmt=png

可以看到所在线程的ID都是1。因为其工作原理就是这样的,程序会阻塞线程以便让NumberFactory来做它的工作。所以说这样不是很理想,最理想的办法是使用C#的异步编程模型,但是在C# 8之前,这是做不到的。但是从C# 8开始,我们就可以这样做了。 

 

Asynchronous Stream异步流 

首先修改NumberFactory,在Task.Delay(1000)前边加上await关键字来代替.Wait()方法,然后再修改返回类型为IAsyncEnumberable<int>,并在前面添加async关键字: 

640?wx_fmt=png

 

回到Main方法,需要做出两个修改: 

640?wx_fmt=png

首先,就是在foreach循环前面加上await关键字,这看起来比较奇怪,但这就是我们遍历异步流的方式。注意是在foreach前边加await,而不是在factory.GenerateNumbers(5)前边加await。 

然后,还需要改变Main方法的返回类型为Task,并加上async关键字。 

 

最后运行程序,看看效果: 

640?wx_fmt=png

可以看到,线程的ID有时候会发生变化,这就是我们想要的效果。在这里流是异步的,当它await任务的时候,该线程是可以去做其它工作的。而当程序继续执行的时候,它确实可能结束于其它的线程。 

更详细教程请点击原文链接。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值