问题描述
我被这个困惑,有人可以告诉我为什么,当我打电话:
I'm baffled by this, can someone tell me why, when I call:
using (Mutex mtx = new Mutex(false, strId))
{
}
我得到这个异常:
I get this exception:
找不到路径的一部分。
如果 strId
设置为类似本地主机\ SQLEX preSS-MYNAME-2
?
推荐答案
的:
在运行终端服务,一个名为系统互斥的服务器 可以有两个级别的可见性。如果它的名字开头的preFIX 全球\的互斥体在所有终端服务器会话可见。如果 它的名字开头的preFIX本地\,互斥体是可见的,只有在 在创建它的终端服务器会话。在这种情况下,一个 具有相同名称的单独的互斥可以在每个其它的存在 在服务器上的终端服务器会话。如果没有指定preFIX 当你创建一个命名的互斥体,它采取了preFIX本地\。在一个 终端服务器会话两个互斥的名字只相差他们 prefixes是分开的互斥体,无一不是对所有进程可见 在终端服务器会话。也就是说,preFIX名全球\ 和本地\形容互斥体的名称相对于终端的范围 服务器会话,不相进程。
由于你是在你的名字用一个反斜杠( \
),它假定您要指定可见性级别,然后发现本地主机
不是一个有效的能见度的水平 - 因此产生的异常
Because you are using a backslash in your name (\
) it assumes you are trying to specify a visibility level, and then discovers localhost
isn't a valid visibility level - hence generating the exception.
这是相当奇怪的.NET文档不明确提及 \
是互斥的名字保留字符,在Win32文档不解释好(link):
It's rather strange the .NET docs don't mention explicitly \
is a reserved character in Mutex names, the Win32 docs do explain it better (link):
的名称可以有一个全球\或本地\preFIX明确创建 全局或会话名称空间中的对象。的其余 名称可以包含除反斜杠字符的任意字符()。对于 更多信息,请参见内核对象命名空间。快速用户切换 使用终端服务会话来实现。内核对象名称必须 按照为终端服务的指导方针,使 应用程序可以支持多个用户。
这篇关于"找不到路径&QUOT的一部分;在创建互斥错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!