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(....);
}
}
}
このファイルから (別のクラスから) 読み取る他のスレッド (およびメインスレッド):
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.
私は何を間違っていますか、私はこれまで解決策を見つけることができませんでした。