内存映射,我可以将对象与内存位置同步吗?

时间:2016-07-10 19:34:37

标签: c# memory-mapped-files

所以我在共享内存文件中有一个内存段,在C中结尾有一个固定大小的缓冲区元素数组。大小我在C#中的结构末尾没有固定大小的数组我已经创建了一个缓冲区结构来封装它并在读取标题后读取它们,这一切都很好。

struct SDKHeader {
    int a;
    int b;
    int numBuf; //Number of buffers to read from
    long c;
}

struct SDKBuffer 
{
    int size;
    int location; //Position in shared memory
}

简化代码,这就是我读它的方式:

memoryMap = MemoryMappedFile.OpenExisting(MemMapFilename);
memoryAccessor = memoryMap.CreateViewAccessor();

int headerSize = Marshal.SizeOf(typeof(SDKHeader));
memoryAccessor.Read(0, out header);

int bufferSize = Marshal.SizeOf(typeof(SDKBuffer));
buffers = new SDKBuffer[header.numBuf];
for(int i = 0; i < header.numBuf; i++)
{
    memoryAccessor.Read(headerSize + i * bufferSize, out buffers[i]);
}

我的问题是这个结构每秒更新几次,在C中它就像pHeader = (HeaderType *)pSharedMem;一样简单,允许原始访问数据而不必将其连续读入另一个区域。在C#中这完全可能吗?以某种方式在共享内存中的struct和memorylocation之间建立连接?

1 个答案:

答案 0 :(得分:1)

您可以使用不安全的代码在C#中执行相同的操作。相同的代码正常工作(final Debouncer debouncer = new Debouncer(); debouncer.debounce(Void.class, new Runnable() { @Override public void run() { // ... } }, 300, TimeUnit.MILLISECONDS); )。

当然,要满足使用不安全代码以及能够以这种方式使用结构的要求。网络搜索很容易将其打开。