在进程被杀死时有效地释放非托管资源

时间:2019-05-02 18:13:47

标签: c# windows mmap memory-mapped-files unmanagedresources

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

所有进程首次运行时,它运行良好,并且可以正确读取数据。但是,如果我通过右键单击->关闭所有窗口来关闭所有进程(因为它们花费很长时间),然后立即再次启动进程,则会遇到类似System.IO.IOException的问题:管道损坏。非托管资源未及时正确清理。我正在程序的结尾处使用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);
...

是否可以解决此问题? “使用”关键字无济于事。我应该使用SafeHandles吗? (我没有使用SafeHandles的经验,但是已经提供了一些SafeMemoryMappedFileHandle / SafeMemoryMappedViewHandles。)

0 个答案:

没有答案