内存操作类(共享映射文件 MemoryMappedFile)

需要完善的地方:

一个内存对象占地1G,资源浪费太严重。动态大小更合理,每次重新创建有可能多个进程之间冲突。

IIS和winform之间存在应用权限隔离,并且iis本身权限较低,涉及系统操作会被拒绝,提权有隐患。

场景有限,效率感人,仅供参考,redis大法好。

    /// <summary>
    /// 首4个字节为文件长度,该类存对应内存区域所存放的数据不能超过1G。内存区域不是私有独占对象。
    /// </summary>
    class memobj
    {
        MemoryMappedFile mmf;
        MemoryMappedViewStream mmvs;
        string name;
        uint maxlen = (1<<30) + 4;


        /// <summary>
        /// 创建一个memobj对象,获取/创建name属性对应的内存映射文件,并写入内容。如果文件已存在,将覆盖。内存区域不是私有独占对象。
        /// </summary>
        /// <param name="name">memobj对象名称,私有</param>
        /// <param name="content">写入内存的内容</param>
        public memobj(string name,byte[] content)
        {
            this.name = name;
            mmf = MemoryMappedFile.CreateOrOpen(name, maxlen, MemoryMappedFileAccess.ReadWrite);
            mmvs = mmf.CreateViewStream();
            if (content.Length >= maxlen)
            {
                throw new OutOfMemoryException();
            }
            else
            {
                WriteContent(content);
            }
        }


        /// <summary>
        /// 创建一个memobj对象,获取/创建name属性对应的内存映射文件。内存区域不是私有独占对象。
        /// </summary>
        /// <param name="name">memobj对象名称</param>
        public memobj(string name)
        {
            this.name = name;
            mmf = MemoryMappedFile.CreateOrOpen(name, maxlen, MemoryMappedFileAccess.ReadWrite);
            mmvs = mmf.CreateViewStream();
        }


        /// <summary>
        /// 将数据长度写入内存区域的首4字节。内存区域不是私有独占对象。
        /// </summary>
        /// <param name="Length"></param>
        private void WriteLength(uint Length)
        {
            byte[] ret = new byte[4];
            ret[0] = Convert.ToByte((Length >> 24) % 256);
            ret[1] = Convert.ToByte((Length >> 16) % 256);
            ret[2] = Convert.ToByte((Length >> 8) % 256);
            ret[3] = Convert.ToByte(Length   % 256);
            mmvs.Position = 0;
            mmvs.Write(ret, 0, 4);
        }


        /// <summary>
        /// 获取内存数据长度,通过前4个字节计算,不存在Length属性。内存区域不是私有独占对象。
        /// </summary>
        /// <returns></returns>
        public int Length()
        {
            mmvs.Position = 0;
            byte[] ret = new byte[4];
            mmvs.Read(ret, 0, 4);
            return (ret[0] << 24) + (ret[1] << 16) + (ret[2]<<8) + ret[3];
        }


        /// <summary>
        /// 写入数据长度到内存区域首4字节。内存区域不是私有独占对象。
        /// </summary>
        /// <param name="content"></param>
        public void WriteContent(byte[] content)
        {
            mmvs.Position = 0;
            WriteLength((uint)content.Length);
            mmvs.Write(content, 0, content.Length);
        }


        /// <summary>
        /// 从内存区域首4字节计算数据长度并读出内存数据。内存区域不是私有独占对象。
        /// </summary>
        /// <returns></returns>
        public byte[] Read()
        {
            int bytLength = Length();
            byte[] ret = new byte[bytLength];
            mmvs.Position = 4;
            mmvs.Read(ret, 0, bytLength);
            return ret;
        }
    }
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Runnerchin/article/details/72765290
个人分类: 代码
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭