创build互斥锁时,“找不到path的一部分”错误

我很困惑,有人可以告诉我为什么,当我打电话给:

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

我得到这个例外:

无法findpath的一部分。

如果strId设置为localhost\SQLEXPRESS-MyName-2类的东西,

从文档 :

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

由于您在名称( \ )中使用了反斜杠,因此假定您正在尝试指定可见性级别,然后发现localhost不是有效的可见性级别,因此会生成异常。

很奇怪.NET文档没有明确提到\是互斥体名称中的保留字符,Win32文档可以更好地解释它( 链接 ):

该名称可以具有“全局”或“本地”前缀以在全局或会话命名空间中显式创建对象。 名称的其余部分可以包含除反斜杠字符()之外的任何字符 。 有关更多信息,请参阅内核对象命名空间 。 使用终端服务会话实现快速用户切换。 内核对象名称必须遵循终端服务概述的准则,以便应用程序可以支持多个用户。