广告
返回顶部
首页 > 资讯 > 精选 >C#的高效IO库System.IO.Pipelines怎么使用
  • 825
分享到

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

2023-07-02 15:07:03 825人浏览 安东尼
摘要

今天小编给大家分享一下C#的高效io库System.IO.Pipelines怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一

今天小编给大家分享一下C#的高效io库System.IO.Pipelines怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

数据读不全:

可能不能在一次read操作中读入所有需要的数据,因此需要在缓冲区中维护一个游标,记录下次读取操作的起始位置,这个游标带了了不小的复杂度:

  • 从缓冲区读数据时,要根据游标计算缓冲区起始写位置,以及剩余空间大小。增加了读数据的复杂度。

  • 解析数据也是复用这个缓冲区的,解析的时候也要判断游标起始位置,剩余空间大小。同时增加了解析数据的复杂度。

  • 解析玩了后还要移动游标,重新标记缓冲区起始位置,再次增加了复杂度。

缓冲区容量有限:

由于缓冲区有限,可能申请的缓冲区不够用,需要引入动态缓冲区。这也大幅加大了代码的复杂度。

  • 如果每次都申请更大的内存,一方面带来的内存申请释放开销,另一方面需要将原来的数据移动,并更新游标,带来更复杂的逻辑。

  • 如果靠多段的内存组成一个逻辑整理,数据的读写方式都比较复杂。

  • 使用完后的内存要释放,如果需要更高的效率还要维持一个内存池。

读和用没有分离

我们的业务本身只关心使用操作,但读和用操作没有分离,复杂的都操作导致用操作也变得复杂,并且严重干扰业务逻辑。

今天介绍微软新推出的一个库:System.IO.Pipelines(需要在Nuget上安装),用于解决这些痛点。它主要包含一个Pipe对象,它有一个Writer属性和Reader属性。

var pipe   = new Pipe();var writer = pipe.Writer;var reader = pipe.Reader;

Writer对象

Writer对象用于从数据源读取数据,将数据写入管道中;它对应业务中的"读"操作。

var content = Encoding.Default.GetBytes("hello world");var data    = new Memory<byte>(content);var result  = await writer.WriteAsync(data);

另外,它也有一种使用Pipe申请Memory的方式

var buffer = writer.GetMemory(512);content.CopyTo(buffer);writer.Advance(content.Length);var result = await writer.FlushAsync();

Reader对象

Reader对象用于从管道中获取数据源,它对应业务中的"用"操作。

首先获取管道的缓冲区:

var result = await reader.ReadAsync();var buffer = result.Buffer;

这个Buffer是一个ReadOnlySequence<byte>对象,它是一个相当好的动态内存对象,并且相当高效。它本身由多段Memory<byte>组成,查看Memory段的方法有:

  • IsSingleSegment: 判断是否只有一段Memory<byte>

  • First: 获取第一段Memory<byte>

  • GetEnumerator: 获取分段的Memory<byte>

它从逻辑上也可以看成一段连续的Memory<byte>,也有类似的方法:

  • Length: 整个数据缓冲区长度

  • Slice: 分割缓冲区

  • CopyTo: 将内容复制到Span中

  • ToArray: 将内容复制到byte[]中

另外,它还有一个类似游标的位置对象SequencePosition,可以从其Position相关函数中使用,这里就不多介绍了。

这个缓冲区解决了"数据读不够"的问题,一次读取的不够下次可以接着读,不用缓冲区的动态分配,高效的内存管理方式带来了良好的性能,好用的接口是我们能更关注业务。

获取到缓冲区后,就是使用缓冲区的数据

var data = buffer.ToArray();

使用完后,告诉PIPE当前使用了多少数据,下次接着从结束位置后读起

reader.AdvanceTo(buffer.GetPosition(4));

这是一个相当实用的设计,它解决了"读了就得用"的问题,不仅可以将不用的数据下次再使用,还可以实现Peek的操作,只读但不改变游标。

交互

除了"读"和"用"操作外,它们之间还需要一些交互,例如:

  • 读过程中数据源不可用,需要停止使用

  • 使用过程中业务结束,需要中止数据源。

Reader和Writer都有一个Complete函数,用于通知结束:

reader.Complete();writer.Complete();

在Writer写入和Reader读取时,会获得一个结果

FlushResult result = await writer.FlushAsync();ReadResult result = await reader.ReadAsync();

它们都有一个IsComplete属性,可以根据它是否为true判断是否已经结束了读和写的操作。

取消

在写入和读取的时候,也可以传入一个CancellationToken,用于取消相应的操作。

writer.FlushAsync(CancellationToken.None);reader.ReadAsync(CancellationToken.None);

如果取消成功,对应的Result的IsCanceled则为true(没有验证过)

以上就是“C#的高效IO库System.IO.Pipelines怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: C#的高效IO库System.IO.Pipelines怎么使用

本文链接: https://www.lsjlt.com/news/342563.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#的高效IO库System.IO.Pipelines怎么使用
    今天小编给大家分享一下C#的高效IO库System.IO.Pipelines怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2023-07-02
  • C#中的高效IO库System.IO.Pipelines
    我们在编写网络程序的时候,经常会进行如下操作: 申请一个缓冲区从数据源中读入数据至缓冲区解析缓冲区的数据重复第2步 表面上看来这是一个很常规而简单的操作,但实际使用过程中往往存在如下...
    99+
    2022-11-13
  • 高效的Python通用对象池化库怎么使用
    本篇内容主要讲解“高效的Python通用对象池化库怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“高效的Python通用对象池化库怎么使用”吧!对象池模式主要适用于以下应用场景:资源受限的...
    99+
    2023-07-06
  • C#中多种高效定时器方法怎么使用
    这篇文章主要讲解了“C#中多种高效定时器方法怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中多种高效定时器方法怎么使用”吧!在 C# 中,定时器是一种常用的机制,可以周期性地执行...
    99+
    2023-07-05
  • Yum怎么高效使用
    本篇内容介绍了“Yum怎么高效使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Yum是一个在Fedora和RedHat以及CentOS中的...
    99+
    2023-06-27
  • C++怎么使用easyX库实现三星环绕效果
    这篇文章主要讲解了“C++怎么使用easyX库实现三星环绕效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么使用easyX库实现三星环绕效果”吧!1,项目描述功能1:使用图形化的方...
    99+
    2023-07-04
  • C++11中的chrono库怎么使用
    本篇内容介绍了“C++11中的chrono库怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言C++11提供了日期时间相关的库chr...
    99+
    2023-07-05
  • C++中TinyXML2库怎么使用
    要使用TinyXML2库,需要按照以下步骤进行操作: 首先,下载TinyXML2库。可以从官方网站(https://github...
    99+
    2023-10-23
    C++ TinyXML2
  • 怎么使用C/C++生成的动态链接库
    这篇文章主要讲解了“怎么使用C/C++生成的动态链接库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用C/C++生成的动态链接库”吧!操作环境:Visual Studio 2017.N...
    99+
    2023-06-26
  • 简洁高效的Python流处理库Faust怎么用
    简洁高效的Python流处理库Faust怎么用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在分布式系统和实时数据处理中,流处理是十分重要的技术。在数据密集型应用中,数据快...
    99+
    2023-06-15
  • 提高效率的Vue指令怎么使用
    这篇文章主要介绍“提高效率的Vue指令怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“提高效率的Vue指令怎么使用”文章能帮助大家解决问题。v-model相信大家对v-model并不陌生,简单...
    99+
    2023-07-05
  • C语言常用的库函数怎么使用
    这篇文章主要介绍“C语言常用的库函数怎么使用”,在日常操作中,相信很多人在C语言常用的库函数怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言常用的库函数怎么使用”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
  • C++11随机数库怎么使用
    本篇内容主要讲解“C++11随机数库怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11随机数库怎么使用”吧!从前的随机数C++11之前,无论是C,还是C++都使用相同方式的来生成随...
    99+
    2023-06-19
  • c++图像处理库怎么使用
    在C++中,有一些流行的图像处理库可以使用。以下是一些常见的图像处理库及其使用方法: OpenCV:OpenCV是一个广泛使用的...
    99+
    2023-10-24
    c++
  • C#并行库Parallel类怎么使用
    本篇内容主要讲解“C#并行库Parallel类怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#并行库Parallel类怎么使用”吧!Parallel.Invoke这个函数的功能和Tas...
    99+
    2023-07-02
  • C/C++ Qt数据库SqlRelationalTable关联表怎么使用
    本篇内容介绍了“C/C++ Qt数据库SqlRelationalTable关联表怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2023-06-22
  • 怎么使用代理ip池更高效
    小编给大家分享一下怎么使用代理ip池更高效,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在网络数据时代,ip代理经常出现在大家的应用中,对于与大数据打交道的用户来...
    99+
    2023-06-15
  • 怎么使用ABAP提高工作效率
    本篇内容主要讲解“怎么使用ABAP提高工作效率”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用ABAP提高工作效率”吧!(1) 直接批量生成数据到ABAP内表里:* 2017-05-14 ...
    99+
    2023-06-04
  • 怎么使用redis提高缓存效率
    以下是一些使用Redis提高缓存效率的方法:1. 设置合适的过期时间:在将数据存储到Redis缓存中时,可以为每个数据设置一个过期时...
    99+
    2023-09-05
    redis
  • C++中标准线程库怎么使用
    本文小编为大家详细介绍“C++中标准线程库怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++中标准线程库怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.创建线程异步执行我们可以通过async...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作