有关MemoryMappingFile的问题

时间:2012-02-12 22:19:47

标签: c#-4.0 .net memory-mapping

我正在尝试在两个进程之间进行通信。从MSDN文档中,我遇到了MemoryMappingFile,我正在使用它来进行通信。

public class SmallCommunicator : ICommunicator
    {
        int length = 10000;
        private MemoryMappedFile GetMemoryMapFile()
        {

            var security = new MemoryMappedFileSecurity();
            security.SetAccessRule(
                new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>("EVERYONE", 
                    MemoryMappedFileRights.ReadWriteExecute, System.Security.AccessControl.AccessControlType.Allow));

            var mmf = MemoryMappedFile.CreateOrOpen("InterPROC", 
                            this.length, 
                            MemoryMappedFileAccess.ReadWriteExecute, 
                            MemoryMappedFileOptions.DelayAllocatePages, 
                            security, 
                            HandleInheritability.Inheritable);

            return mmf;

        }

        #region ICommunicator Members

        public T ReadEntry<T>(int index) where T : struct
        {
            var mf = this.GetMemoryMapFile();
            using (mf)
            {
                int dsize = Marshal.SizeOf(typeof(T));
                T dData;
                int offset = dsize * index;
                using (var accessor = mf.CreateViewAccessor(0, length))
                {
                    accessor.Read(offset, out dData);
                    return dData;
                }
            }
        }

        public void WriteEntry<T>(T dData, int index) where T : struct
        {
            var mf = this.GetMemoryMapFile();
            using (mf)
            {
                int dsize = Marshal.SizeOf(typeof(T));
                int offset = dsize * index;
                using (var accessor = mf.CreateViewAccessor(0, this.length))
                {
                    accessor.Write(offset, ref dData);
                }
            }
        }

        #endregion
    }

任何人都可以告诉我为什么这段代码不起作用。与磁盘文件一起使用时的代码相同。

在连续读取和写入时,数据似乎丢失了。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

好吧,我遇到了问题。

看起来MemoryMappedFile需要保持不受限制,以便窗口自动处理。所以当我读或写时,我不能包括

使用(mf)

块。这将删除共享内存。 所以实际的代码应该是:

 public void WriteEntry<T>(T dData, int index) where T : struct
        {
            var mf = this.GetMemoryMapFile();
            int dsize = Marshal.SizeOf(typeof(T));
            int offset = dsize * index;
            using (var accessor = mf.CreateViewAccessor(0, this.length))
            {
                accessor.Write(offset, ref dData);
            }
        }

非常感谢。