我正在尝试在两个进程之间进行通信。从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
}
任何人都可以告诉我为什么这段代码不起作用。与磁盘文件一起使用时的代码相同。
在连续读取和写入时,数据似乎丢失了。我错过了什么吗?
答案 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);
}
}
非常感谢。