2016-11-25 7 views
0

Я сделал приложение в системном трее на C#, которое просто работает в фоновом режиме. Он прослушивает почтовый сервер с помощью Exchange WebServices и выполняет набор действий каждый раз, когда mailaccount получает сообщение. Он использует несколько приложений Excel, которые не работают должным образом, если я конвертирую в программу в службу (поэтому она должна быть системным приложением).Как я могу убедиться, что программа работает только один раз во всех сеансах на сервере Windows 2012?

Важно, чтобы программа не запускала больше, чем один раз за раз. Я добавил блокировку мьютекса, поэтому я не могу запускать программу более одного раза на одном сеансе. Однако проблема заключается в том, что когда я вхожу в другой сеанс на Windows Server (у него может быть два сеанса на пользователя), программа не отображается в системном трее, и я могу открыть ее снова, поэтому она запускается дважды, по одному в каждом сессия. Как я могу это предотвратить?

Благодаря

+0

Создайте файл с зарезервированным именем, например. 'C: \ temp' и заблокировать его, поэтому экземпляр # 2 заметит и выйдет? –

+0

Какое имя мьютекса? Если имя мьютекса начинается с Global \, оно является глобальным для всех сеансов служб терминалов. Вы также должны проверить разрешения мьютекса, чтобы они были доступны всем пользователям. –

+0

см. Этот вопрос SO http://stackoverflow.com/questions/229565/what-is-a-good-pattern-for-using-a-global-mutex-in-c –

ответ

0

Вы должны увидеть все процессы, как это:

using System.Diagnostics; 
var allProcceses = Process.GetProcesses(); 

Затем вы можете проверить, если программа запущена.

+0

Но когда я запускаю программу, всегда будет процесс с этим именем. Если моя программа называется mailChecker, и в этой программе я проверяю, открыт ли mailChecker, он всегда будет возвращать true, потому что mailChecker chekcs, если mailChecker открыт. Или я ошибаюсь? – Spliid

+0

Вы можете использовать GetProcessesByName и искать MailChecker. Если он уже был запущен, вы увидите две записи, и в этот момент программа может остановить себя. – Mant101

+0

Извините за поздний ответ. Либо сделайте так, как сказал @ Mant101, и проверьте количество процессов. Или получить текущий процесс, используя «Process.GetCurrentProcess()» и сравнить Id, если они одинаковы, вы смотрите на текущий процесс программы. – MrApnea

 Смежные вопросы

  • Нет связанных вопросов^_^