Мое приложение вынуждено использовать сторонний модуль, который будет 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.
Как я обхожу это?
Префикс имени мьютекса с "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 \".
Измените имя мьютекса, чтобы оно начиналось с Global \
.
На сервере, на котором запущены службы терминалов , именованный системный мьютекс может иметь два уровня видимости. Если его имя начинается с префикса "Global \", мьютекс виден во всех сеансах сервера терминала . Если его имя начинается с префикса "Local \", мьютекс виден только в сеансе сервера терминалов, в котором он был создан. В этом случае отдельный мьютекс с тем же именем может существовать в каждом из других сеансов сервера терминалов на сервере . Если вы не указываете префикс при создании именованного мьютекса, он принимает префикс "Local \". В сеансе терминального сервера два мьютекса , имена которых отличаются только префиксом , являются отдельными мьютексами, и оба видны всем процессам в {{1 }} сеанс терминального сервера. То есть имена префиксов "Global \" и "Local \" описывают область действия имени мьютекса относительно сеансов терминального сервера, а не относительных процессам.