我对此感到困惑,有人告诉我为什么,当我打电话时:
using (Mutex mtx = new Mutex(false, strId))
{
}
我得到了这个例外:
无法找到路径的一部分。
如果strId
设置为localhost\SQLEXPRESS-MyName-2
?
答案 0 :(得分:19)
在运行终端服务的服务器上,命名系统互斥锁 可以有两个级别的可见性。如果其名称以前缀开头 " Global \",互斥锁在所有终端服务器会话中都可见。如果 它的名称以前缀" Local \"开头,互斥锁只在其中可见 创建它的终端服务器会话。在那种情况下,a 具有相同名称的单独互斥体可以存在于每个互斥体中 服务器上的终端服务器会话。如果您没有指定前缀 当您创建一个命名的互斥锁时,它采用前缀" Local \"。在一个 终端服务器会话,两个名称仅由它们不同的互斥锁 前缀是单独的互斥锁,并且两者都对所有进程可见 在终端服务器会话中。也就是说,前缀名称" Global \" 和"本地\"描述相对于终端的互斥锁名称的范围 服务器会话,而不是与进程相关。
由于您在名称中使用反斜杠(\
),因此假定您尝试指定可见性级别,然后发现localhost
不是有效的可见性级别 - 因此生成异常。
相当奇怪的是.NET文档没有明确提及\
是互斥体名称中的保留字符,Win32文档确实更好地解释了它(link):< / p>
这个名字可以有一个&#34; Global \&#34;或&#34;本地\&#34;显式创建的前缀 全局或会话命名空间中的对象。 其余部分 name可以包含除反斜杠字符()之外的任何字符。对于 更多信息,请参阅Kernel Object Namespaces。快速用户切换是 使用终端服务会话实现。内核对象名称必须 遵循终端服务概述的指导原则 应用程序可以支持多个用户。