Ошибка "Не удалось найти часть пути" при создании Mutex

Я озадачен этим, может кто-нибудь сказать мне, почему, когда я звоню:

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

Я получаю это исключение:

Не удалось найти часть пути.

Если для параметра strId установлено значение localhost\SQLEXPRESS-MyName-2?

Ответы

Ответ 1

Из документов:

На сервере, на котором запущены службы терминалов, именованный системный мьютекс может иметь два уровня видимости. Если его имя начинается с префикса "Глобальный", мьютекс отображается во всех сеансах сервера терминалов. Если его имя начинается с префикса "Локальный", мьютекс виден только в сеанс сервера терминалов, где он был создан. В этом случае отдельные мьютексы с таким же именем могут существовать в каждом другом сеансы сервера терминалов на сервере. Если вы не указали префикс при создании именованного мьютекса он принимает префикс "Локальный". В пределах сеанс сервера терминалов, два мьютекса, имена которых отличаются только их префиксы представляют собой отдельные мьютексы, и оба они видны для всех процессов в сеансе сервера терминалов. То есть имена префиксов "Global \" и "Локальный" описывают объем имени мьютекса относительно терминала серверных сессий, а не относительно процессов.

Поскольку вы используете обратную косую черту в своем имени (\), предполагается, что вы пытаетесь указать уровень видимости, а затем обнаруживаете, что localhost не является допустимым уровнем видимости - следовательно, генерирует исключение.

Довольно странно, что в документах .NET явно не упоминается \ - зарезервированный символ в именах Mutex, документы Win32 лучше объясняют (ссылка)

Имя может иметь префикс "Глобальный" или "Локальный" для явного создания объект в глобальном или сеансовом пространстве имен. Остальная часть имя может содержать любой символ, кроме символа обратной косой черты(). Для Дополнительная информация, см. Пространства имен объектов ядра. Быстрая коммутация пользователей с использованием сеансов служб терминалов. Имена объектов ядра должны следуйте рекомендациям, изложенным для служб терминалов, приложения могут поддерживать несколько пользователей.