Проблема, связанная с MemoryMappingFile - PullRequest
2 голосов
/ 13 февраля 2012

Я пытаюсь общаться между двумя процессами. Из документации 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 голосов
/ 14 февраля 2012

Что ж, у меня проблема.

Кажется, что файл MemoryMappedFile нужно держать неиспользуемым, чтобы окна автоматически обрабатывали его.Поэтому, когда я читаю или пишу, я не должен включать

, используя (mf)

block.Это удалит общую память.Таким образом, фактический код должен быть:

 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);
            }
        }

В любом случае, спасибо.

...