перекрестный пользователь взаимное исключение C#

Мое приложение вынуждено использовать сторонний модуль, который будет 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);
    }

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

Как я обхожу это?

23
задан Warpin 13 May 2010 в 21:45
поделиться

2 ответа

Префикс имени мьютекса с "Global \".

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

Из http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx :

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

37
ответ дан 29 November 2019 в 01:35
поделиться

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

Источник

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

13
ответ дан 29 November 2019 в 01:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: