创建Mutex时出现“找不到路径的一部分”错误

16

我对此感到困惑,有人能告诉我为什么当我调用:

using (Mutex mtx = new Mutex(false, strId))
{
}

我遇到了这个异常:

无法找到路径的一部分。

如果 strId 被设置为类似于 localhost\SQLEXPRESS-MyName-2 的东西会怎么样?


@paqogomez:我不确定为什么在打开互斥体时会引发“DirectoryNotFoundException”?这两者没有任何关系... - ahmd0
如果你读他的错误信息,它是:“无法找到路径 '<mutex name>'”。答案也是解决方案。 - crthompson
好的,我明白你的意思。虽然,再说一遍,目录异常被抛出是很奇怪的...但是,嗯,我想我必须替换斜杠了... - ahmd0
关于为什么会出现这个问题,我认为@Niels已经回答得非常好了。因为你在名字中使用了反斜杠(\),它会认为你正在尝试指定一个可见性级别,然后发现localhost不是一个有效的可见性级别 - 因此生成异常。祝你好运 :) - crthompson
2
我将此提名重新开放,因为另一个主题中的答案至少可以说是“不完整”,更可以说是非常不正确。 - Niels Keurentjes
请注意,Global\mutexname或Local\mutexname区分大小写,因此GLOBAL\mutexname也会引发此错误,因为它是全大写。 - Brain2000
1个回答

27

来自文档

在运行终端服务的服务器上,命名系统互斥体可以具有两个可见性级别。如果其名称以前缀“Global\”开头,则互斥体在所有终端服务器会话中都可见。如果其名称以前缀“Local\”开头,则互斥体仅在创建它的终端服务器会话中可见。在这种情况下,具有相同名称的另一个互斥体可以存在于服务器上的每个其他终端服务会话中。如果您在创建命名的互斥体时没有指定前缀,则采用前缀“Local\”。在终端服务会话中,名称仅通过前缀不同的两个互斥体是单独的互斥体,并且所有进程都可见。也就是说,“Global\”和“Local\”前缀名称描述了互斥体名称相对于终端服务器会话而言的范围,而不是相对于进程。

因为你在名字中使用了反斜杠(\),它认为你正在尝试指定一个可见性级别,然后发现localhost不是一个有效的可见性级别,因此生成了异常。
很奇怪的是,.NET文档没有明确提到\是Mutex名称中的保留字符,Win32文档解释得更好(link):

名称可以带有“Global\”或“Local\”前缀,以明确地在全局或会话命名空间中创建对象。名称的其余部分可以包含任何字符,除了反斜杠字符(\)。有关更多信息,请参阅Kernel Object Namespaces。快速用户切换使用终端服务会话实现。内核对象名称必须遵循终端服务的指南,以便应用程序可以支持多个用户。


谢谢。这正是我所参考的:http://msdn.microsoft.com/en-us/library/windows/desktop/aa382954(v=vs.85).aspx 但是没有明确提到斜杠。他们只谈到了 Global\Local\Session\ 前缀,因此我认为只要我不使用这些前缀,就没问题了。显然并非如此... - ahmd0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接