前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#8:异步流

C#8:异步流

原创
作者头像
用户4831957
修改2019-11-04 17:01:22
5800
修改2019-11-04 17:01:22
举报

例子

C#8:异步流
C#8:异步流

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

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

C#8:异步流
C#8:异步流

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

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

C#8:异步流
C#8:异步流
C#8:异步流
C#8:异步流

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

Asynchronous Streams 异步流

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

C#8:异步流
C#8:异步流

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

C#8:异步流
C#8:异步流

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

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

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

C#8:异步流
C#8:异步流

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档