межпользовательский мьютекс C # - PullRequest
22 голосов
/ 14 мая 2010

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

    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);
    }
* 1006.* Проблема в том, что если два пользователя могут одновременно войти в систему и открыть приложение, а IsAnotherInstanceRunning () вернет false.

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

Ответы [ 2 ]

35 голосов
/ 14 мая 2010

Префикс имени мьютекса с «Global \». От http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx:

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

13 голосов
/ 14 мая 2010

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

Источник

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

...