C#的高效IO库System.IO.Pipelines怎么使用


今天小编给大家分享一下C#的高效IO库System.IO.Pipelines怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。可能不能在一次read操作中读入所有需要的数据,因此需要在缓冲区中维护一个游标,记录下次读取操作的起始位置,这个游标带了了不小的复杂度:从缓冲区读数据时,要根据游标计算缓冲区起始写位置,以及剩余空间大小。增加了读数据的复杂度。解析数据也是复用这个缓冲区的,解析的时候也要判断游标起始位置,剩余空间大小。同时增加了解析数据的复杂度。解析玩了后还要移动游标,重新标记缓冲区起始位置,再次增加了复杂度。由于缓冲区有限,可能申请的缓冲区不够用,需要引入动态缓冲区。这也大幅加大了代码的复杂度。如果每次都申请更大的内存,一方面带来的内存申请释放开销,另一方面需要将原来的数据移动,并更新游标,带来更复杂的逻辑。如果靠多段的内存组成一个逻辑整理,数据的读写方式都比较复杂。使用完后的内存要释放,如果需要更高的效率还要维持一个内存池。我们的业务本身只关心使用操作,但读和用操作没有分离,复杂的都操作导致用操作也变得复杂,并且严重干扰业务逻辑。今天介绍微软新推出的一个库:System.IO.Pipelines(需要在Nuget上安装),用于解决这些痛点。它主要包含一个Pipe对象,它有一个Writer属性和Reader属性。Writer对象用于从数据源读取数据,将数据写入管道中;它对应业务中的”读”操作。另外,它也有一种使用Pipe申请Memory的方式Reader对象用于从管道中获取数据源,它对应业务中的”用”操作。首先获取管道的缓冲区:这个Buffer是一个ReadOnlySequence对象,它是一个相当好的动态内存对象,并且相当高效。它本身由多段Memory组成,查看Memory段的方法有:IsSingleSegment: 判断是否只有一段MemoryFirst: 获取第一段MemoryGetEnumerator: 获取分段的Memory它从逻辑上也可以看成一段连续的Memory,也有类似的方法:Length: 整个数据缓冲区长度Slice免费云主机域名: 分割缓冲区CopyTo: 将内容复制到Span中ToArray: 将内容复制到byte[]中另外,它还有一个类似游标的位置对象SequencePosition,可以从其Position相关函数中使用,这里就不多介绍了。这个缓冲区解决了”数据读不够”的问题,一次读取的不够下次可以接着读,不用缓冲区的动态分配,高效的内存管理方式带来了良好的性能,好用的接口是我们能更关注业务。获取到缓冲区后,就是使用缓冲区的数据使用完后,告诉PIPE当前使用了多少数据,下次接着从结束位置后读起这是一个相当实用的设计,它解决了”读了就得用”的问题,不仅可以将不用的数据下次再使用,还可以实现Peek的操作,只读但不改变游标。除了”读”和”用”操作外,它们之间还需要一些交互,例如:读过程中数据源不可用,需要停止使用使用过程中业务结束,需要中止数据源。Reader和Writer都有一个Complete函数,用于通知结束:在Writer写入和Reader读取时,会获得一个结果它们都有一个IsComplete属性,可以根据它是否为true判断是否已经结束了读和写的操作。在写入和读取的时候,也可以传入一个CancellationToken,用于取消相应的操作。如果取消成功,对应的Result的IsCanceled则为true(没有验证过)以上就是“C#的高效IO库System.IO.Pipelines怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道。

相关推荐: vue.js编译时怎么给生成文件增加版本号

本篇内容主要讲解“vue.js编译时怎么给生成文件增加版本号”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue.js编译时怎么给生成文件增加版本号”吧!vue.js在生成相关js和css文件的时候,名称是通过HA…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/17 18:23
下一篇 03/17 18:23

相关推荐