无缓存高效流(NoCacheStream)

场景:某个方法需要写入流,另一个方法需要将刚写入流的内容读取再处理,整个过程是一次性无需缓存的情况下,可以不使用MemoryStream,那个会占内存,同时由于MemoryStream容量的不固定,扩容的过程也会对性能产生影响。为了可以提供高效的流读写性能,设计一个无缓存流。

此流的写入和读取必须分为2个不同的线程,否则将无法正常工作,推荐写入使用后台线程,而读取使用当前线程,即直接当前线程使用该流对象(读取或返回)。

此流的写入是基于读取的,如果没有读取,写入将无限等待,直到有读取动作,获取读取方缓存,直接往读取方缓存数组中写入。

/// <summary>
/// Written in reading
/// </summary>
public class NoCacheStream : Stream
{
    private ManualResetEvent enablewrite = new ManualResetEvent(false);
    private AutoResetEvent enableread = new AutoResetEvent(false);
    private volatile byte[] innerbuffer;
    private int num, inneroffset, innercount;
    private bool isend;

    public override bool CanRead
    {
        get { return true; }
    }

    public override bool CanSeek
    {
        get { return false; }
    }

    public override bool CanWrite
    {
        get { return true; }
    }

    public override void Flush()
    {
        throw new NotImplementedException();
    }

    public override long Length
    {
        get { throw new NotImplementedException(); }
    }

    public override long Position
    {
        get
        {
            throw new NotImplementedException();
        }
        set
        {
            throw new NotImplementedException();
        }
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        if (isend)
            return 0;

        innerbuffer = buffer;
        inneroffset = offset;
        innercount = count;
        num = 0;
        enablewrite.Set(); // allow write
        enableread.WaitOne(); // wait to read
        return num;
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        throw new NotImplementedException();
    }

    public override void SetLength(long value)
    {
        throw new NotImplementedException();
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        if (isend)
            return;

        enablewrite.WaitOne();//wait read method signal

        while (count >= innercount)
        {
            Array.Copy(buffer, offset, innerbuffer, inneroffset, innercount);
            offset += innercount;
            count -= innercount;
            num += innercount;
            enablewrite.Reset();//block write
            enableread.Set();//allow read
            enablewrite.WaitOne();//wait to write
        }

        if (count > 0)
        {
            Array.Copy(buffer, offset, innerbuffer, inneroffset, count);
            inneroffset += count;
            innercount -= count;
            num += count;
        }
    }

    /// <summary>
    /// End of read-write
    /// </summary>
    public void End()
    {
        isend = true;
        enableread.Set();
    }
}
时间: 2024-08-09 19:51:43

无缓存高效流(NoCacheStream)的相关文章

I/O供应的缓存类型:全缓存,行缓存,无缓存

文件缓存进程:当数据从内存向磁盘输出时,数据必需先送到缓存中,等到缓存满了或许次第恳求清空缓存的时分,数据才被写入磁盘. 全缓存:该类型中,文件的实习操作是缓存被布满以后进行的缓存没有完全被布满时,系统不会自动将文件写入磁盘.除非系统调用改写(flush操作强即将数据写入磁盘. 行缓存:输入和输出进程中遇到行结束标志的时分,规范I/O库就实行实习的I/O操作. 无缓存:系统不会为流分配内存,每一次规范I/O函数的调用都会使得底层I/O调用被实行. 文件的翻开与关闭 当系统操作一个文件时,会在内存

浅谈无缓存I/O操作和标准I/O文件操作差别

首先,先略微了解系统调用的概念: 系统调用,英文名system call,每一个操作系统都在内核里有一些内建的函数库,这些函数能够用来完毕一些系统系统调用把应用程序的请求传给内核,调用对应的的内核函数完毕所需的处理,将处理结果返回给应用程序,假设没有系统调用和内核函数,用户将不能编写大型应用程序,及别的功能,这些函数集合起来就叫做程序接口或应用编程接口(ApplicationProgramming Interface,API),我们要在这个系统上编写各种应用程序,就是通过这个API接口来调用系统

浅谈无缓存I/O操作和标准I/O文件操作区别

首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序,及别的功能,这些函数集合起来就叫做程序接口或应用编程接口(ApplicationProgramming Interface,API),我们要在这个系统上编写各种应用程序,就是通过这个API接口来调用系统内

无缓存I/O操作和标准I/O文件操作区别

本文转载于:http://www.360doc.com/content/11/0521/11/5455634_118306098.shtml 首先,先稍微了解系统调用的概念:       系统调用,英文名systemcall,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序,及别的功能,这些函数集合起来就叫做程序接口或应用编程

sgu 194 Reactor Cooling(有容量上下界的无源无汇可行流)

[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20757 [题意] 求有容量上下界的无源无汇可行流. [思路] 无源无汇可行流要求所有的顶点都满足流量平衡. 基本思路是转化成最大流来做. 对于边(u,v,b,c),连边(u,v,c-b).为了保持流量平衡,我们还需要连边         1.(S,u,inB[u]-outB[u])  inB>outB 2.(u,T,outB[u]-inB[u])  outB>

web-请求无缓存

<head><META HTTP-EQUIV="pragma" CONTENT="no-cache"><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"><meta http-equiv="Content-Type" content="text/html; charset

JSP设置无缓存

1.<% //设置无缓存 response.setHeader("progma","no-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires",0); %> 2.设置页面Nocache方式,即每次访问此页面,均需要从服务器重新读取,而不是使用缓存中存在的此页面. 在jsp

No caching ——无缓存工具

No caching --无缓存工具 无缓存工具阻止客户端应用程序(如Web浏览器)缓存任何资源,因此,请求总是发送到远程站点,所以我们总能看到最新版本. 适用场景 开发每次新部署了一版环境,说解决了XXBUG,但有时测试回归的时候会发现BUG并没有被解决,开发会质疑是不是缓存问题,有时候不是,有时候还真的是.不是的时候一直在那儿强刷很傻,真的是的时候场面会很尴尬--所以这个工具这种时候应该就会比较好用. 适用范围 该工具可以作用于每个请求(选中 Enable No Caching 即可),也可

TimesTen 数据库复制学习:7. 管理Active Standby Pair(无缓存组)

Active Standby Pair是TimesTen复制的一种固定模式,就是1个active到1个standby,再到0个或127个subscriber,如下图: 配置 Active Standby Pair (不带缓存组) 大致步骤如下: 1. 创建数据库 2. 使用CREATE ACTIVE STANDBY PAIR创建复制 3. 调用Call ttRepStateSet('ACTIVE'),将active数据库的角色设为ACTIVE 4. 调用Call ttRepStart, 启动复制