文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#中的高效IO库System.IO.Pipelines

2024-04-02 19:55

关注

我们在编写网络程序的时候,经常会进行如下操作:

表面上看来这是一个很常规而简单的操作,但实际使用过程中往往存在如下痛点:

数据读不全:

可能不能在一次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段的方法有:

它从逻辑上也可以看成一段连续的Memory<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的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯