C# MemoryMappedFile - 读写的不同进程
C# MemoryMappedFile - Different Processes for Read & Write
我在使用 C# 中的 MemoryMappedFiles 时遇到了一些问题。
当我只使用 1 个进程时,它们工作得很好,但是当我尝试从不同的进程访问 mmf 文件时,我得到允许这样做的错误。
我有一个数据记录器,它将传入数据写入 mmf 文件:
private void WriteRawToFile(.....)
{
MemoryMappedFileSecurity security = new MemoryMappedFileSecurity();
security.AddAccessRule(new AccessRule<MemoryMappedFileRights>(("Everyone"), MemoryMappedFileRights.FullControl, AccessControlType.Allow));
using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(new FileStream(@"data.mmf", FileMode.OpenOrCreate), "mmf", Int32.MaxValue / 100, MemoryMappedFileAccess.ReadWriteExecute, security, HandleInheritability.Inheritable, false))
{
using (MemoryMappedViewAccessor view = mmf.CreateViewAccessor(size*rawId, size, MemoryMappedFileAccess.CopyOnWrite))
{
view.WriteArray(....);
}
}
}
其他线程(和主线程)从这个文件(从另一个class)读取:
private float[] ReadRawFromFile(....)
{
MemoryMappedFileSecurity security = new MemoryMappedFileSecurity();
security.AddAccessRule(new AccessRule<MemoryMappedFileRights>(("Everyone"), MemoryMappedFileRights.FullControl, AccessControlType.Allow));
using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(new FileStream(@"data.mmf", FileMode.OpenOrCreate), "mmf", Int32.MaxValue / 100, MemoryMappedFileAccess.ReadWriteExecute, security, HandleInheritability.Inheritable, false))
{
using (MemoryMappedViewAccessor view = mmf.CreateViewAccessor(size*rawId, size, MemoryMappedFileAccess.Read))
{
view.ReadArray(....);
}
}
return res;
}
使用这段代码,我在阅读时遇到异常:
Some or all identity references could not be translated.
最初我在没有 MemoryMappedFileSecurity 的情况下尝试过:
using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile("data.mmf", FileMode.OpenOrCreate , "mmf", Int32.MaxValue / 100, MemoryMappedFileAccess.ReadWriteExecute))
using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile("data.mmf", FileMode.Open, "mmf", Int32.MaxValue / 100, MemoryMappedFileAccess.Read))
但后来我又遇到了一个异常:
The process cannot access the file 'data.mmf' because it is being used by another process.
我哪里做错了,至今没找到解决方法
此错误消息与安全无关。这是关于对同一文件的文件共享访问。
根据反射器,您使用的CreateFromFile
重载总是使用FileShare.None
。那似乎没有用。 Use a better overload. 在这里,您可以自己创建 FileStream
并使用适当的共享模式。
我在使用 C# 中的 MemoryMappedFiles 时遇到了一些问题。 当我只使用 1 个进程时,它们工作得很好,但是当我尝试从不同的进程访问 mmf 文件时,我得到允许这样做的错误。
我有一个数据记录器,它将传入数据写入 mmf 文件:
private void WriteRawToFile(.....)
{
MemoryMappedFileSecurity security = new MemoryMappedFileSecurity();
security.AddAccessRule(new AccessRule<MemoryMappedFileRights>(("Everyone"), MemoryMappedFileRights.FullControl, AccessControlType.Allow));
using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(new FileStream(@"data.mmf", FileMode.OpenOrCreate), "mmf", Int32.MaxValue / 100, MemoryMappedFileAccess.ReadWriteExecute, security, HandleInheritability.Inheritable, false))
{
using (MemoryMappedViewAccessor view = mmf.CreateViewAccessor(size*rawId, size, MemoryMappedFileAccess.CopyOnWrite))
{
view.WriteArray(....);
}
}
}
其他线程(和主线程)从这个文件(从另一个class)读取:
private float[] ReadRawFromFile(....)
{
MemoryMappedFileSecurity security = new MemoryMappedFileSecurity();
security.AddAccessRule(new AccessRule<MemoryMappedFileRights>(("Everyone"), MemoryMappedFileRights.FullControl, AccessControlType.Allow));
using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(new FileStream(@"data.mmf", FileMode.OpenOrCreate), "mmf", Int32.MaxValue / 100, MemoryMappedFileAccess.ReadWriteExecute, security, HandleInheritability.Inheritable, false))
{
using (MemoryMappedViewAccessor view = mmf.CreateViewAccessor(size*rawId, size, MemoryMappedFileAccess.Read))
{
view.ReadArray(....);
}
}
return res;
}
使用这段代码,我在阅读时遇到异常:
Some or all identity references could not be translated.
最初我在没有 MemoryMappedFileSecurity 的情况下尝试过:
using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile("data.mmf", FileMode.OpenOrCreate , "mmf", Int32.MaxValue / 100, MemoryMappedFileAccess.ReadWriteExecute))
using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile("data.mmf", FileMode.Open, "mmf", Int32.MaxValue / 100, MemoryMappedFileAccess.Read))
但后来我又遇到了一个异常:
The process cannot access the file 'data.mmf' because it is being used by another process.
我哪里做错了,至今没找到解决方法
此错误消息与安全无关。这是关于对同一文件的文件共享访问。
根据反射器,您使用的CreateFromFile
重载总是使用FileShare.None
。那似乎没有用。 Use a better overload. 在这里,您可以自己创建 FileStream
并使用适当的共享模式。