有没有办法从WaitHandle
获取MemoryMappedFile
?分配的名称似乎与尝试使用相同名称获取或创建互斥锁相冲突。
const string name = "tobyd";
MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(name, 64);
Mutex mx = new Mutex(true, name); // bang! sadness.
如果我使用Mutex.TryOpenExisting
静态,我会返回false
并在out参数中为null。毫不奇怪。
MemoryMappedFile中的内容正在耗尽此引用名称?您如何等待MMF发布才能重新使用该名称?
答案 0 :(得分:0)
简化的内存映射文件是一种操作系统结构,用于将文件映射到虚拟内存,而无需从磁盘读取整个文件。
相反,它正在访问内存中的实际介质(HDD,SSD,NAS等)。 这是一个跨进程的构造,以确保不超过一个实例(进程/线程)同时向其写入某种锁。
我不知道我会认为Windows正在使用带有mapName(文件名)的Mutex解决此问题。
修改
反编译类MemoryMappedFile时,您会注意到它正在使用Windows kernel32函数CreateFileMapping,该函数指出:
如果lpName与现有事件,信号量,互斥量,可等待计时器或作业对象的名称匹配,则该函数将失败,并且GetLastError函数将返回ERROR_INVALID_HANDLE。发生这种情况是因为这些对象共享相同的名称空间。
静态方法MemoryMappedFile.CreatOrOpen
中的参数mapName将在调用CreateFileMapping
中传递给lpName
如果该语句为true,则此代码也会失败:
const string name = "tobyd";
Mutex mx = new Mutex(true, name);
MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(name, 64); // bang! sadness.
有鉴于此,我认为我最初的假设是正确的。