.NET - ограничение количества экземпляров исполнительного блока

Допустим, у меня есть приложение, написанное на C#, называемое EquipCtrl.exe, которое выполняется как локальный процесс на ПК для управления оборудованием.

Очевидно, я хотел бы иметь только один экземпляр Equipctrl для запуска на каждом ПК. Если бы у меня было два устройства для управления на ПК, я бы ограничил его двумя экземплярами на ПК.

То, как я это сделал, было одно из 1. Имя процесса. Я называю процесс EqCtrl и при запуске процесса он будет считать число процессов с именем "EqCtrl". 2. Имя исполнения. При запуске подсчитайте количество процессов с именем выполнения EquipCtrl.exe. 3. Реестр записей. 4. Запись базы данных SQL Server.

Для меня обнаружение имени процесса или имени выполнения - самое простое и то, что я делаю больше всего (если не все) времени. Но они подвержены конфликтам имен. Даже если я пойду дальше, чтобы узнать путь выполнения, ограничение можно обойти, скопировав файл выполнения в другую папку.

Каков наилучший способ ограничения выполнения в.NET? Зачем? Является ли запись в реестре лучшим способом?

4 ответа

Решение

Попробуйте общесистемный семафор: http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

Блог Скотта Хансельмана имеет отличный пост на эту тему...

http://www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx

Вы можете сделать это путем подсчета именованного mutex\semaphore, а также убедиться, что создаваемый префикс mutex / семафор начинается с GLOBAL\ и LOCAL\, иначе подключение к удаленному рабочему столу не будет считывать этот именованный мьютекс и счет будет потерян.

http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx

Хм.. когда мы хотим разрешить только один экземпляр приложения, мы используем именованный мьютекс

Это не совсем позволяет сценарий, который вы хотите.

Еще один момент, во избежание коллизий, помимо имени исполняемого файла и каталога, используйте MD5-хэш исполняемого файла.

Другие вопросы по тегам