0

我有多个进程(或者更确切地说是一个进程的多个实例)试图(创建或)访问单个内存映射文件。我正在使用 Mutex 来同步(第一次)创建 mmap 文件。

当所有进程第一次运行时,它运行良好并且数据被正确读取。但是,如果我通过“右键单击->关闭所有窗口”关闭所有进程(因为它们需要很长时间)并立即重新启动进程,我将面临诸如 System.IO.IOException: Pipe is broken 之类的问题。未及时清理非托管资源。我在程序结束时使用 dispose() 方法。

MemoryMappedFile mmf;
Mutex mutex = new Mutex(false, mmapName.Substring(2));
mutex.WaitOne();
try
{  
    mmf = MemoryMappedFile.OpenExisting(mmapName);
}
catch (FileNotFoundException)
{
    mmf = MemoryMappedFile.CreateFromFile(rFile, FileMode.Open, mmapName);
}
mutex.ReleaseMutex();
MemoryMappedViewStream fileStream = mmf.CreateViewStream(0, 0, 
MemoryMappedFileAccess.Read);
...

有没有办法解决这个问题?'using' 关键字无济于事。我应该使用 SafeHandles 吗?(我对 SafeHandles 没有经验,但已经提供了一些 SafeMemoryMappedFileHandle / SafeMemoryMappedViewHandles。)

4

0 回答 0