2010-02-08 3 views
1

Я разрабатываю долго выполняющийся процесс, в котором размещаются удаленные объекты. Из-за ограничений по дизайну я не могу использовать службу Windows, поэтому этот процесс является фоном для приложения Forms. Я также не могу использовать WPF, потому что мы ограничены .Net 2.0. В любом случае, поскольку нет гарантии, что фоновый процесс запущен, я хочу иметь возможность установить флаг системы из процесса, который я могу проверить у другого..Net System Wide Flag, чтобы определить, запущено ли приложение/поток

Я прочитал и попытался использовать Mutex's, но, похоже, не существует способа определить, существует ли Mutex, не создавая его, если он уже не существует (если я не пропущу что-то, что всегда возможно).

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

Может ли кто-нибудь предложить хороший способ достичь этого?

+0

Да, вы должны использовать Mutex's. Но на днях у меня это не получилось, поэтому я не дам ответа :) Кроме того, вам, вероятно, понадобится глобальный мьютекс, как описано в MSDN. – leppie

+0

Я думаю то же самое, но самая большая проблема заключается в том, что я использую Mutex.OpenExisting и мьютекс определен, клиентское приложение принимает на себя это право, и оно освобождается, когда этот поток заканчивается, и это не сработает. Это заставляет меня думать, что использование мьютекса не обязательно является правильным подходом. – Jason

ответ

1

Да, используйте класс Mutex. Вам понадобится конструктор Mutex (bool, string, out bool), последний аргумент «createdNew» сообщает вам, что мьютекс еще не создан. Префикс имени мьютекса с «глобальным», если вы хотите обнаружить, что любая версия программы запущена в любом сеансе (включая службы и удаленный вход в систему).

+0

Я пробовал этот подход. Проблема в том, что второе приложение создаст мьютекс, если оно уже не существует, и тогда его время жизни контролируется этим потоком. Это неверно, срок службы должен контролироваться только приложением с большим хостом. Я смотрю теперь на добавление прав Mutex в приложение, которое работает в течение длительного времени, и пытается открыть OpenExitsting. Это должно вызвать исключение во втором приложении ... – Jason

+0

Вам нужно сделать его статическим, чтобы его время жизни контролировалось процессом (AppDomain, действительно). Не хост-процесс, вспомогательный процесс. –

0

Таким образом, использование контроля доступа на мьютексе является ответом. Вот что я сделал:

На длинном запущенном процессе

 Dim MutextWasCreated As Boolean 

     ' Create a security rule for the mutex so other threads cannot take ownership 
     Dim MutexSec As New MutexSecurity 
     Dim rule As New MutexAccessRule(Environment.UserDomainName & "\" & Environment.UserName, MutexRights.TakeOwnership, AccessControlType.Deny) 

     MutexSec.AddAccessRule(rule) 

     App_Mutex = New Mutex(True, "Global\MyMutexName}", MutextWasCreated, MutexSec) 
     App_Mutex.WaitOne(-1, True) 

Затем на приложение клиента, используйте следующую попытку открыть мьютекс:

  Dim HostIsRunning As Boolean 

     Try 
      Mutex.OpenExisting("Global\MyMutexName", AccessControl.MutexRights.TakeOwnership) 
     Catch ex As Exception 
      If TypeOf ex Is UnauthorizedAccessException Then 
       ' The mutex is created by the host to dissalow other threads from taking ownership. If we get this exception, we know the mutext has been created, thus the app is running. 
       HostIsRunning = True 
      ElseIf TypeOf ex Is WaitHandleCannotBeOpenedException Then 
       HostIsRunning = False 
      Else 
       Throw ex 
      End If 
     End Try 
0

от основного процесса выставить с ремоутинга samething, как

MyProcessInfo: MarshalByRef { BOOL IsRunning() { return true; }}

если удаленные вызовы бросает исключение «не может найти MyProcessInfo.rem службы» (я не помню точные слова) процесс не активен, и если вы хотите, вы можете вернуть ту же информацию, как ваш простой целочисленный перечисление

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