Надежно обнаружив, что другое из моих приложений работает - PullRequest
0 голосов
/ 10 июня 2009

У меня есть два приложения, приложение WinForms и служба Windows, которые будут работать на одном компьютере. Я хочу, чтобы приложение WinForms надежно определяло, когда служба запущена. Я полностью контролирую разработку и реализацию обоих приложений.

Моя первая мысль - использовать Mutex , созданный Сервисом и обнаруживаемый приложением WinForms.

Есть ли лучший дизайн?

Ответы [ 6 ]

7 голосов
/ 10 июня 2009

K. Скотт Аллен имеет хорошую справку об использовании Mutex для этой цели и проблем, с которыми вы столкнетесь с GC.

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

[STAThread]
static void Main() 
{
   using(Mutex mutex = new Mutex(false, "Global\\" + appGuid))
   {
      if(!mutex.WaitOne(0, false))
      {
         MessageBox.Show("Instance already running");
         return;
      }

      Application.Run(new Form1());
   }
}

EDIT: Изменен строковый литерал для использования экранированной обратной косой черты вместо @, так что подсветке синтаксиса SO не понравилась дословная строка.

3 голосов
/ 10 июня 2009

Мутекс - это путь. Это гораздо менее хрупко, чем использование имен процессов и т. Д.

Однако вы должны убедиться, что Mutex не является сборщиком мусора. В случае службы (которая управляется событиями, а не имеет "основного" метода, который выполняется до конца), наиболее разумный способ сделать это, вероятно, поместить его в статическую переменную.

Утилизируйте мьютекс, когда служба останавливается, поэтому вам не нужно ждать завершения или чего-то подобного.

2 голосов
/ 10 июня 2009

Вы можете использовать Mutex, но вы также можете использовать класс ServiceController. Это позволит вам узнать, установлена ​​ли служба, и если она запущена, но не запущена, запустите ее, если применимо.

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller_members.aspx

1 голос
/ 10 июня 2009

Вы можете реализовать некоторую функциональность «Проверка соединения» в сервисе. Я не знаю, будет ли это работать для ваших требований, хотя. При запуске winforms вы можете позвонить в службу, чтобы увидеть, если она жива. Вы можете предоставить услугу с помощью простого контракта WCF.

Надеюсь, это поможет ...

0 голосов
/ 10 июня 2009

В качестве альтернативы ваше приложение WinForms может проверить список запущенных служб, чтобы узнать, запущена ли служба.

0 голосов
/ 10 июня 2009

аналогичный вопрос [согласно ответам, вы на правильном пути]

...