Подтвердить что ты не робот

Кросс-пользовательский С# mutex

Мое приложение вынуждено использовать сторонний модуль, который будет синим экраном Windows, если одновременно запускаются два экземпляра на одном компьютере. Чтобы обойти эту проблему, мое приложение С# имеет мьютекс:

    static Mutex mutex = new Mutex(true, "{MyApp_b9d19f99-b83e-4755-9b11-d204dbd6d096}");  

И я проверяю, присутствует ли он - и если это так, я покажу сообщение об ошибке и закрою приложение:

    bool IsAnotherInstanceRunning()
    {
        if (mutex.WaitOne(TimeSpan.Zero, true))
            return (true);
        else
            return (false);
    }

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

Как мне обойти это?

4b9b3361

Ответ 1

Префикс имени мьютекса с именем "Глобальный". Из http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx:

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

Ответ 2

Измените имя мьютекса, чтобы начать с Global\.

Источник

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