创建互斥锁时"无法找到路径的一部分"错误

ahm*_*md0 12 .net c# windows mutex

我对此感到困惑,有人告诉我为什么,当我打电话时:

using (Mutex mtx = new Mutex(false, strId))
{
}
Run Code Online (Sandbox Code Playgroud)

我得到这个例外:

找不到路径的一部分.

如果strId设置为类似localhost\SQLEXPRESS-MyName-2

Nie*_*jes 19

来自文档:

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

因为您在名称(\)中使用反斜杠,所以它假定您尝试指定可见性级别,然后发现localhost不是有效的可见性级别 - 因此生成异常.

.NET文档没有明确提到\Mutex名称中的保留字符,这是相当奇怪的,Win32文档确实更好地解释了它(链接):

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