2009-07-13 14 views
1

Ich verwende C# Windows-Anwendung.Überprüfen Sie die Instanzen der App und killen Sie es

Wenn meine Anwendung gestartet wird, möchte ich die Instanzen im Taskmanager für die gleiche Anwendung überprüfen. Wenn Instanzen bereits ausgeführt werden, shud den Prozess beenden und den neuen starten.

Dies ist sicherzustellen, dass nur eine Instanz der Anwendung ausgeführt wird.

Antwort

1

Hier ist eine schnelle und schmutzige Möglichkeit, um sicherzustellen, dass nur eine Instanz Ihres Programms ausgeführt wird. Das Geheimnis ist ein Mutex.

[STAThread] 
static void Main()     
{ 
    bool ok; 
    m = new System.Threading.Mutex(true, "YourNameHere", out ok); 

    if (!ok) 
    { 
     MessageBox.Show("Another instance is already running."); 
     return; 
    } 

    // Do some stuff here... 

    GC.KeepAlive(m);     
} 

Dieser Code versucht, einen Mutex (mutual exclusion) mit einem bestimmten Namen zu erstellen und wenn es es nicht schaffen kann dann eine Instanz dieses Programms muss bereits laufen.

+0

dieser Code braucht ein bisschen Arbeit, für einen es behandelt nicht verlassene Mutexe –

+0

Ja, du hast Recht. Ich nehme an, Sie könnten die WaitOne-Methode auf dem Mutex aufrufen und wenn es fehlschlägt, fangen Sie den AbandonedMutexException-Fehler ab und behandeln Sie die Dinge entsprechend. Das ist auch keine wirklich gute Lösung. Wie ich schon sagte, es ist schnell und dreckig. : p – CalebHC

0
public Process[] ExistingProcesses()  
{ 
    string processName = Process.GetCurrentProcess().ProcessName; 
    Process[] processes = Process.GetProcessesByName(processName); 
    return processes; 
} 
1

Das klingt für mich sehr aggressiv und ist wahrscheinlich nicht die beste Idee.

Vielleicht möchten Sie maintain a single instance of your app.

+0

Folgen Sie dem Link für mehr über die Mutex-Lösung. –

0

Anstatt abhängig von Prozessname, der auch versehentlich durch Umbenennen der ausführbaren Datei besiegt werden kann, ist die traditionelle Methode, nach einer vorhandenen Instanz zu suchen, ein benanntes Handle, z. B. ein Mutex. Überprüfen Sie während des Startvorgangs, ob es bereits vorhanden ist, und fahren Sie sofort herunter, wenn dies der Fall ist.

bearbeiten

Ich habe gerade gelesen, die Frage wieder und es klingt wie Sie wirklich die vorherige Instanz töten wollen, nicht die neue töten. Das nächste, an das ich mich erinnern kann, wenn ich dieses Verhalten sehe, ist das, was Google Chrome tut, wenn Sie ein neues Fenster öffnen und das alte nicht mehr reagiert. Aber auch das prüft auf mangelnde Reaktion und fordert den Benutzer auf. Das Töten des alten Prozesses klingt ein bisschen extrem. Bist du sicher, dass du das machen willst?

Verwandte Themen