异步流?

Async Stream 简单说来是一种非同步的迭代器模式,说更白一点就是可以await 的foreach。在过去的C# 中如果要回传一个可迭代的IEnumerable<T> ,我们可能会这样写:

    public class EnumerableProcess{async static public Task<IEnumerable<string>> ReadLineAsync(string path){           List<string> list = new List<string>();using (StreamReader reader = File.OpenText(path)){while (await reader.ReadLineAsync() is string result){list.Add(result);await Task.Delay(100);}}return list;}}

  这是一个非同步一行一行读取文字档的例子,这个例子里的回传型别是一个Task<IEnumerable<string>>   ,外部程式码将会这样呼叫这个方法:

 var r = await EnumerableProcess.ReadLineAsync(path);foreach (var item in r){Console.WriteLine(item);}

  

这造成一个长时等待的问题,因为呼叫端必须等待ReadLineAsync 这个Task 整个完成后才能回传;所以C# 8.0 引入了Async Stream 使得非同步的迭代得以实现, 这件事情不仅仅牵涉到编译器,也需要一些新的型别,主要是以下三个:

(1) IAsyncDisposable -- IAsyncEnumerator<out T> 将会拓展这个介面

public interface IAsyncDisposable
{ValueTask DisposeAsync();
}

(2)IAsyncEnumerator <out T>

public interface IAsyncEnumerator<out T> : IAsyncDisposable
{T Current { get; }ValueTask<bool> MoveNextAsync();
}

(3)IAsyncEnumerable <out T>

public interface IAsyncEnumerable<out T>
{IAsyncEnumerator<T> GetAsyncEnumerator();
}

实作Async Stream

由于此时在框架中对于整个Async Stream 的实作尚未完整,所以没办法直接使用yield return,先示范最基本的写法,建立一个类别,并且实作以上介面:

    sealed class AsyncFileProcess : IAsyncEnumerable<string>, IAsyncEnumerator<string>{private readonly StreamReader _reader;private bool _disposed;public AsyncFileProcess(string path){_reader = File.OpenText(path);_disposed = false;}public string Current { get; private set; }public IAsyncEnumerator<string> GetAsyncEnumerator(){return this;}async public ValueTask<bool> MoveNextAsync(){await Task.Delay(100);            var result = await _reader.ReadLineAsync();Current = result;return result != null;}async public ValueTask DisposeAsync(){await Task.Run(() => Dispose());}private void Dispose(){Dispose(true);GC.SuppressFinalize(this);}private void Dispose(bool disposing){if (!this._disposed){if (_reader != null){_reader.Dispose();}_disposed = true;}}}

呼叫端就可以这样呼叫它:

var process = new AsyncFileProcess("SourceFile.txt");
try
{await foreach (var s in process){Console.WriteLine(s);}Console.ReadLine();
}
finally
{await process.DisposeAsync();
}

你可以感受到第一个例子是停顿了很久之后,蹦一下全跳出来;而第二的例子则会一行行跑出来(为了强化这个效果在两方都加了Task.Delay )。在第二个例子的呼叫端可以看到await foreach 的使用。

转载于:https://www.cnblogs.com/wwwblender-3dcn/p/10162224.html

C# 8.0 抢先看-- Async Stream相关推荐

  1. 飞桨深度学习开源框架2.0抢先看:成熟完备的动态图开发模式

    百度飞桨于近期宣布,深度学习开源框架2.0抢先版本正式发布,进入2.0时代.其中一项重大升级,就是推出更加成熟完备的命令式编程模式,即通常说的动态图模式.同时在该版本中将默认的开发模式定为动态图模式, ...

  2. vue3.0抢先看(附尤雨溪vue分享ppt)

    点击上方"前端小苑",选择"置顶公众号" 精品技术文章,热门资讯第一时间送达 昨天尤大在深圳的一次vue分享中,介绍了vue3.0的新特性和主要改动点,文章底部 ...

  3. 发布在即,全新 EMQX v5.0 抢先看

    我们很高兴地向大家宣布:EMQX v5.0.0-rc.2 现已发布,距离全新的 EMQX v5.0 更近一步! 目前,EMQX v5.0 正式版的主要功能已经成型,发布在即.本文将通过 EMQX v5 ...

  4. CANN 5.0硬核技术抢先看

    摘要:2021年12月,CANN5.0版本也将与大家正式见面,通过软硬件协同优化,该版本将会实现训练性能再翻倍,凭实力展现AI领域的「中国速度」! 本文分享自华为云社区<CANN 5.0硬核技术 ...

  5. 抢先看! Lumion 10 正式发布之核心功能预览

    昨晚, Lumion 10发布了! 小编带大家一同预览 Lumion 10 正式发布之核心功能 没有什么比案例来的更为直观 这个不到3分钟的新功能视频预览 足以呈现全新Lumion10.0带来的精彩 ...

  6. 2022 Apache IoTDB 物联网生态大会 | 议题嘉宾公布,大会亮点抢先看!

    议题&嘉宾公布 大会亮点抢先看! 2022ApacheIoTDB物联网生态大会将于12月3日.4日的9:30-16:30进行线上直播.本次大会由中国通信学会作为指导单位,Apache IoTD ...

  7. 倒计时2天!2022腾讯全球数字生态大会大数据专场内容抢先看

    2022腾讯全球数字生态大会 倒计时2天! "数实创新,产业共进",届时,产业互联网峰会.云湾峰会.Techo前沿技术论坛.腾讯产业合作伙伴峰会.腾讯云国际峰会,以及50+分会场将 ...

  8. 国际嵌入式大会精彩内容抢先看!

    关注+星标公众号,不错过精彩内容 来源 | 上海国际嵌入式展 创办于2003年的德国纽伦堡embedded world嵌入式展,作为全球嵌入式行业的焦点,不仅每年能吸引到欧洲乃至全球重要生产厂商和应用 ...

  9. 这些跨国巨头都来了...第二届进博会六大亮点抢先看!

    进入倒计时!第二届中国国际进口博览会(China International Import Expo,简称:进博会.CIIE)即将于11月5日-10日登陆上海国家会展中心. 在去年,首届进口博览会汇聚 ...

最新文章

  1. call,apply,bind,new实现原理
  2. Python中Queue.get()方法阻塞
  3. linux设备驱动——总线、设备、驱动
  4. 爱数的诗和远方:云端数据运营服务
  5. DSTREAM-PT仿真器——ARM公司推出的最高性能的调试跟踪解决方案
  6. 《图书管理系统——java》
  7. PHP使用PDO方式的经验总结:连接 增删改查
  8. datagrip mysql乱码_DataGrip和IDEA无法连接上Mysql问题解决方法详解
  9. php选择符和举例子,关于CSS3中选择符的实例详解
  10. mysql 时间函数大全_mysql常用的日期函数汇总
  11. 简单的INSERT语句
  12. LintCode刷题——打劫房屋I、II、III
  13. jQuery.Validate.js验证大表单的优化
  14. weblogic 下载文件问题
  15. 电脑键盘快捷键和组合键功能使用大全
  16. 惠普服务器不进系统,HP服务器无法启动
  17. 苹果Mac优化清理工具CleanMyMac X2023版本
  18. 微信怎么更新最新版本?两招搞定,别轻易卸载!
  19. GraphPad Prism 科研绘图(一)
  20. python中time是什么意思_python中time的基本介绍

热门文章

  1. springmvc使用spring自带日期类型验证
  2. row_number() OVER(PARTITION BY)函数
  3. time,gettimeofday,clock_gettime,_ftime
  4. 在我的网站上开通了WebPart演示和下载列表。
  5. ON TOP-N and pagination queries
  6. Android inflate方法与 findViewById 方法区别
  7. android 获取视频第一帧作为缩略图
  8. VWware安装ubuntu设置静态IP
  9. armeabi-v7a/arm64-v8a/x86/x86_64均兼容armeabi
  10. FreeType(字体渲染引擎):支持多种字体格式(TTF,TTC等)