C# MemoryMappedFile等待句柄和互斥

C# MemoryMappedFile等待句柄和互斥,c#,C#,有没有办法从内存配置文件中获取等待句柄?分配的名称似乎与尝试使用相同名称获取或创建互斥体冲突 const string name = "tobyd"; MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(name, 64); Mutex mx = new Mutex(true, name); // bang! sadness. 如果我使用Mutex.TryOpenExistingstatic,我将返回false并在out参数中返回null。

有没有办法从
内存配置文件
中获取
等待句柄
?分配的名称似乎与尝试使用相同名称获取或创建互斥体冲突

const string name = "tobyd";
MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(name, 64);
Mutex mx = new Mutex(true, name); // bang! sadness.
如果我使用
Mutex.TryOpenExisting
static,我将返回
false
并在out参数中返回null。毫不奇怪


MemoryMappedFile中的什么正在使用此引用名称?如何等待MMF发布后才能重新使用该名称?

简化内存映射文件是一种可操作的系统结构,用于将文件映射到虚拟内存,而无需从磁盘读取整个文件

相反,它访问的是实际介质(HDD、SSD、NAS等),就像它在内存中一样。 这是一个跨进程构造,以确保不超过一个实例(进程/线程)同时向其写入某些类型的锁

在不知道的情况下,我会假设Windows正在使用带有mapName(文件名)的互斥来解决这个问题

编辑

反编译该类时,您会注意到它使用的是windows内核32函数,该函数声明:

如果lpName与现有事件、信号量、互斥、可等待计时器或作业对象的名称匹配,则函数失败,GetLastError函数返回错误\u无效\u句柄。这是因为这些对象共享相同的命名空间

静态方法
MemoryMappedFile.CreatOrOpen
中的参数mapName将在调用
CreateFileMapping

如果该语句为真,则此代码也将失败:

const string name = "tobyd";
Mutex mx = new Mutex(true, name);
MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(name, 64); // bang! sadness.

有鉴于此,我认为我最初的假设是正确的。

为什么不生成一个随机字符串作为名称?该名称是一个任意标识符。只要您(或Dispose代码)能够正确释放该句柄,任何字符串都应该可以。或者,如果您看到这一点,它将展示如何使用互斥来增加延迟,以便您可以排队等待访问。。我更感兴趣的是,为什么MMF标识符会干扰互斥标识符(在我的头脑中,它们是不同的概念,也许对操作系统来说不是这样?)以及如何等待重用可能分配给至少两个不同抽象之一的名称。可能使用vars…可以使用它的
SafeMemoryMappedFileHandle
属性值获取MMF句柄。至于名称,是的,这类对象共享一个通用的Windows命名空间。要看到这一点,请以管理员身份运行WinObj,并导航到
\Sessions\[N]\BaseNamedObjects
(将[N]替换为正确的值,在我的PC上为3),您将看到tobyd作为MMF的
部分
,作为互斥体的
变体。不同类型但名称相同。