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

来源:互联网 发布:七天网络app在哪下载 编辑:程序博客网 时间:2024/06/07 10:52

需要完善的地方:

一个内存对象占地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;        }    }
原创粉丝点击