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

时间:2013-12-21 00:37:21

标签: c# .net windows mutex

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

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

我得到了这个例外:

  

无法找到路径的一部分。

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

1 个答案:

答案 0 :(得分:19)

From the docs

  

在运行终端服务的服务器上,命名系统互斥锁   可以有两个级别的可见性。如果其名称以前缀开头   " Global \",互斥锁在所有终端服务器会话中都可见。如果   它的名称以前缀" Local \"开头,互斥锁只在其中可见   创建它的终端服务器会话。在那种情况下,a   具有相同名称的单独互斥体可以存在于每个互斥体中   服务器上的终端服务器会话。如果您没有指定前缀   当您创建一个命名的互斥锁时,它采用前缀" Local \"。在一个   终端服务器会话,两个名称仅由它们不同的互斥锁   前缀是单独的互斥锁,并且两者都对所有进程可见   在终端服务器会话中。也就是说,前缀名称" Global \"   和"本地\"描述相对于终端的互斥锁名称的范围   服务器会话,而不是与进程相关。

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

相当奇怪的是.NET文档没有明确提及\是互斥体名称中的保留字符,Win32文档确实更好地解释了它(link):< / p>

  

这个名字可以有一个&#34; Global \&#34;或&#34;本地\&#34;显式创建的前缀   全局或会话命名空间中的对象。 其余部分   name可以包含除反斜杠字符()之外的任何字符。对于   更多信息,请参阅Kernel Object Namespaces。快速用户切换是   使用终端服务会话实现。内核对象名称必须   遵循终端服务概述的指导原则   应用程序可以支持多个用户。