如何在C#中使用共享内存功能的MemoryMappedViewAccessor

How to use MemoryMappedViewAccessor of shared memory function in C#

我参考了msdn share memory

并找到 CreateViewStream,现在我要创建 int

在内存中使用 MemoryMappedViewAccessor

// Process A:
    static void Main(string[] args)
    {
        using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000))
        {
        bool mutexCreated;
        Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
        using (MemoryMappedViewStream stream = mmf.CreateViewStream())
        {
            BinaryWriter writer = new BinaryWriter(stream);
            writer.Write(1);
        }
        mutex.ReleaseMutex();

        // Read Int 
        MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
        // For Process B Read
        accessor.Write(499, 41);
        // For Process B Read
        accessor.Write(500, 42);
        // For Process C Read
        accessor.Write(501, 43);
        accessor.Dispose();

        Console.WriteLine("Start Process B and press ENTER to continue.");
        Console.ReadLine();

        Console.WriteLine("Start Process C and press ENTER to continue.");
        Console.ReadLine();

        mutex.WaitOne();
        using (MemoryMappedViewStream stream = mmf.CreateViewStream())
        {
            BinaryReader reader = new BinaryReader(stream);
            MemoryMappedViewAccessor access = mmf.CreateViewAccessor();
            Console.WriteLine("Process A says: {0} ", reader.ReadBoolean());
            Console.WriteLine("Process B says: {0} ", reader.ReadBoolean());
            Console.WriteLine("Process C says: {0} ", reader.ReadBoolean());

            Console.WriteLine("Process A Int:{0}", access.ReadInt32(499));
            Console.WriteLine("Process B Int:{0}", access.ReadInt32(500));
            Console.WriteLine("Process C Int:{0}", access.ReadInt32(501));
            access.Dispose();
        }
        mutex.ReleaseMutex();
        mmf.Dispose();
    }
    Console.Read();
}

但是结果如下

Process A says: True Process B says: False Process C says: False Process A Int:2828841 Process B Int:11050 Process C Int:43

谁能告诉我问题所在?

为什么结果流程A、B

不是 41 和 42

更改此代码

// For Process B Read
accessor.Write(499, 41);
// For Process B Read
accessor.Write(503, 42);
// For Process C Read
accessor.Write(507, 43);
Console.WriteLine("Process A Int:{0}", access.ReadInt32(499));
Console.WriteLine("Process B Int:{0}", access.ReadInt32(503));
Console.WriteLine("Process C Int:{0}", access.ReadInt32(507));

那么结果就是

进程A Int:41 进程 B Int:42 进程 C Int:43

或更改此代码

Console.WriteLine("Process A Int:{0}", access.ReadByte(499));
Console.WriteLine("Process B Int:{0}", access.ReadByte(500));
Console.WriteLine("Process C Int:{0}", access.ReadByte(501));

结果相同

感谢@Hans Passant