c # - Pålideligt opdage, at en anden af ​​mine applikationer kører

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har to applikationer, en WinForms app og en Windows Service, der begge kører på samme maskine. Jeg vil gerne have WinForms appen pålideligt opdage, når tjenesten kører. Jeg har fuldstændig kontrol over design og implementering af begge applikationer.


Min første tanke er at bruge en Mutex, der er oprettet af Tjenesten og detekteres af WinForms App. [4]


Er der et bedre design?

Bedste reference


Mutex er vejen at gå. Det er meget mindre skrøbeligt end at bruge procesnavne mv.


Du skal dog sørge for, at Mutex ikke er skaffet indsamlet. I tilfælde af en service (som er begivenhedsdrevet i stedet for at have en 'hoved' metode, der løber til afslutning), er den mest fornuftige måde at gøre dette på sandsynligvis at sæt det i en statisk variabel.


Bortskaf mutexen, når tjenesten stopper, så du behøver ikke vente på afslutningen eller noget lignende.

Andre referencer 1


K. Scott Allen har en god skrive om brugen af ​​en Mutex til dette formål og udfordrer dig med at komme ind i GC. [5]



  Hvis jeg kun vil have en forekomst af applikationen, der løber på tværs af alle sessioner på maskinen, kan jeg sætte den navngivne mutex i det globale navneområde med præfikset '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:
Ændret streng bogstavelig for at bruge undslippet backslash i stedet for @, så syntes syntax højttaler ikke den ordsomme streng.

Andre referencer 2


Du kan bruge en Mutex, men du kan også bruge klassen ServiceController i stedet. Dette vil give dig mulighed for at finde ud af om tjenesten er installeret, og hvis den er startet, skal du starte den, hvis det er relevant.


http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller\_members.aspx[6]

Andre referencer 3


Du kan implementere nogle 'Connection Test' -funktionalitet på tjenesten. Jeg ved ikke, om det vil fungere for dine krav selv.
Ved opstarten kan du ringe til tjenesten for at se om den er i live. Du kan udsætte tjenesten med en simpel WCF kontrakt.


Håber dette hjælper...

Andre referencer 4


lignende spørgsmål [[ifølge svarene der, er du på rette spor]]

Andre referencer 5


Som et alternativ kan din WinForms app tjekke listen over kørende tjenester for at se, om tjenesten kører.