.NET / Mono Singleton (Service / Server?) In C # - erkennen, ob meine .net app bereits läuft und Kommandozeilen-args, um es passieren

StackOverflow https://stackoverflow.com/questions/810181

  •  03-07-2019
  •  | 
  •  

Frage

Ich mag eine einfache Singleton Commandline Anwendung (einen Service?) Schaffen, in C #, dass, wenn es ausgeführt wurde, wird geprüft, ob es bereits ausgeführt wird, und wenn ja, es bestand die Kommandozeilen args auf dem läuft bereits Instanz und schloss sich. Jetzt in der bereits laufenden Instanz wäre es die Befehlszeilen args durch ein Ereignis wie erhalten „delegate void Befehl (string [] args);“ oder so etwas, so kann ich Befehlszeile durch eine Anwendung über Ereignisse verwalten.

Zum Beispiel in Photoshop, wenn Sie ein Bild zum ersten Mal öffnen, lädt es eine neue Instanz photoshop, aber wenn man ein zweites Bild zu öffnen, überprüft er, ob eine Instanz von Photoshop bereits ausgeführt wird, und wenn es es das Bild auf die bereits geladene Instanz von photoshop geht so es wieder die teure Ladezeit von photoshop vermeiden kann ...

oder im Web-Browser, können Sie es so, wenn Sie eine neue HTML-Datei öffnen, sie in einem neuen Tab öffnet, kein neues Fenster Instanz.

oder viele Texteditoren Einstellungen haben nur eine Instanz des Texteditors zu erlauben, offen und wenn eine neue Datei geöffnet wird, wird es in einem neuen Tab geladen, kein neues Fenster ...

viele Musik-Player wie winamp dies auch tun ...

Ich werde schließlich dies als Dienst werden Einstellung, so dass es ständig für Kommandozeilen-args hören sein sollte, später, aber jetzt meistens ist es so, dass ich das Öffnen von Dateien eines bestimmten Typs verwalten können zusammen in einem Singleton Anwendung oder haben andere Anwendungen Befehlszeilenargumente von Dateien, die sie wollen, zu öffnen passieren ...

Auch, wenn Sie einen besseren Weg oder eine api in .Net wissen neu Router alle Kommandozeilen-args, auf ein Ereignis von einem Dienst, der immer läuft, kann ich damit arbeiten ... aber ich d auch diese Cross-Plattform halten mag, so dass es in Linux / Mac auf Mono laufen kann, wenn das möglich ist, ohne dass zwei oder mehr Code-Basen verwalten ...

War es hilfreich?

Lösung

Dies ist der Artikel i verwendet, um die genaue Funktionalität zu implementieren, die Sie suchen, ermöglicht es Ihnen Befehlszeilenargumente als auch zu übertragen.

Single Instance C # Anwendung - für .NET 2.0

Andere Tipps

Wir haben etwas simillar obwohl für einen ganz anderen Zweck verwendet mit .NET Remoting auf 1.0 / 1.1-Framework. Grundsätzlich würden wir eine Semaphore verwenden, um sicherzustellen, dass wir die einzige laufende Instanz waren. Sie werden den globalen Namensraum ausrichten möchten, wenn Sie nur eine Instanz pro Maschine haben wollen oder das lokal, wenn Sie einen pro Benutzersitzung (im Terminal Service und schnelle Benutzerumschaltung Szenarien) werden sollen.

Wenn Sie die Semaphore beinhaltet sperren können, werden Sie Setup-Remoting und starten Sie für Ereignisse hören, und dann mit dem Code weiter auf.

Wenn Sie nicht sperren können, dann können Sie asssume Sie haben eine andere laufende Instanz in diesem Fall werden Sie einen Remote Kanal zum anderen Instanz die args und Herunterfahren passieren öffnen.

Sie könnten versuchen, eine benannte Mutex (Namensgebung wird es systemweit machen, und leicht zu identifizieren). Mit dem Mutex, können Sie entweder laufen die Instanz (wenn kein Mutex mit dem Namen existiert), oder Sie können die vorhandene Instanz öffnen und in Ihre Parameter übergeben. Apologies für kein Codebeispiel, schreibt dies aus meinem Handy.

Edit: nvrmnd. nachzulesen nur den Pfosten, und ich glaube nicht, das funktioniert für Sie Cross-Plattform gehen.

Visual Basic hat diese eingebaut. Schauen Sie sich auf:

Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase - öffentliche Veranstaltung StartupNextInstance

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top