Предотвращение одновременного запуска одного и того же приложения, но на основе входного параметра - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу запретить запуск экземпляра для определенного параметра, введенного из командной строки.Я хочу разрешить запуск нескольких экземпляров, если все они принимают разные параметры.Вот мой фрагмент кода, пытающийся реализовать это:

private static readonly Mutex SingletonA = new Mutex(true, "A");
private static readonly Mutex SingletonB = new Mutex(true, "B");

var arguments = Environment.GetCommandLineArgs();

if(arguments[1]=="A" && !SingletonA.WaitOne(TimeSpan.Zero, true)) return; //end the process
if(arguments[1]=="B" && !SingletonB.WaitOne(TimeSpan.Zero, true)) return; //end the process

Однако я заметил, что SingletonA и SingletonB будут иметь значение false, если есть работающий экземпляр.

Есть ли способ реализовать это?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Согласно Документации Microsoft для этого конструктора (выделено мое):

Если name не равно null и initialOwned имеет значение true, вызывающий поток владеет мьютексом, только если названныйсистемный мьютекс был создан в результате этого вызова. Поскольку отсутствует механизм для определения того, был ли создан именованный системный мьютекс, лучше указывать значение false для initialOwned при вызове этой перегрузки конструктора. Вы можете использовать конструктор Mutex (Boolean, String, Boolean), еслинеобходимо определить начальное владение.

Измените вызов, чтобы передать false для параметра владения, и все должно быть установлено.

private static readonly Mutex SingletonA = new Mutex(
    false, 
    "A");
private static readonly Mutex SingletonB = new Mutex(
    false,
    "B");

(хотя этот пример, вероятно, не 'Это супер полезно для других, так как первый процесс сразу принимает оба синглета Mutex, и нет никакого контекста относительно того, как долго он их держит, почему, когда, или как процесс завершается.)

0 голосов
/ 19 декабря 2018

Обратите внимание, что этот ответ только иллюстрирует идею и не содержит кода, готового к использованию:

private static Mutex Singleton = null;
...
var arguments = Environment.GetCommandLineArgs();
var mutexName = arguments[1];

Singleton = new Mutex(false, mutexName);

if(!Singleton.WaitOne(TimeSpan.Zero, true)) return; //end the process

или

private static Mutex Singleton = null;
...
var arguments = Environment.GetCommandLineArgs();
var mutexName = arguments[1];
var isCreated = false;

Singleton = new Mutex(true, mutexName, isCreated);

if (!isCreated)
  Environment.Exit(1); //end the process  
...