我对此感到困惑,有人能告诉我为什么当我调用:
using (Mutex mtx = new Mutex(false, strId))
{
}
我遇到了这个异常:
无法找到路径的一部分。
如果 strId
被设置为类似于 localhost\SQLEXPRESS-MyName-2
的东西会怎么样?
我对此感到困惑,有人能告诉我为什么当我调用:
using (Mutex mtx = new Mutex(false, strId))
{
}
我遇到了这个异常:
无法找到路径的一部分。
如果 strId
被设置为类似于 localhost\SQLEXPRESS-MyName-2
的东西会怎么样?
来自文档:
因为你在名字中使用了反斜杠(在运行终端服务的服务器上,命名系统互斥体可以具有两个可见性级别。如果其名称以前缀“Global\”开头,则互斥体在所有终端服务器会话中都可见。如果其名称以前缀“Local\”开头,则互斥体仅在创建它的终端服务器会话中可见。在这种情况下,具有相同名称的另一个互斥体可以存在于服务器上的每个其他终端服务会话中。如果您在创建命名的互斥体时没有指定前缀,则采用前缀“Local\”。在终端服务会话中,名称仅通过前缀不同的两个互斥体是单独的互斥体,并且所有进程都可见。也就是说,“Global\”和“Local\”前缀名称描述了互斥体名称相对于终端服务器会话而言的范围,而不是相对于进程。
\
),它认为你正在尝试指定一个可见性级别,然后发现localhost
不是一个有效的可见性级别,因此生成了异常。\
是Mutex名称中的保留字符,Win32文档解释得更好(link):
名称可以带有“Global\”或“Local\”前缀,以明确地在全局或会话命名空间中创建对象。名称的其余部分可以包含任何字符,除了反斜杠字符(\)。有关更多信息,请参阅Kernel Object Namespaces。快速用户切换使用终端服务会话实现。内核对象名称必须遵循终端服务的指南,以便应用程序可以支持多个用户。
Global\
、Local\
和 Session\
前缀,因此我认为只要我不使用这些前缀,就没问题了。显然并非如此... - ahmd0