Frage

Okay, so habe ich meine c # .NET-Anwendung erstellt, ein Installationsprogramm für sie geschaffen und es wird Arbeits auf meinem Rechner installiert ist.

Das Problem ist, wenn der Benutzer die Anwendung exe zweimal öffnet, wird es zwei Instanzen der Anwendung ausgeführt werden. Ich immer nur wollen eine Instanz der Anwendung jederzeit ausgeführt werden, wie gehe ich über das tun dies?

Danke für Ihre Hilfe,

War es hilfreich?

Lösung

Die übliche Technik hierfür ist ein benannte Mutex und prüfen, ob seine Anwesenheit beim Start der Anwendung zu erstellen.

Siehe dieses oder diese .

-Code von DDJ:

class App : Form
{
    Mutex mutex;

    App()
    {
        Text = "Single Instance!";
        mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX");
        if (!mutex.WaitOne(0, false)) 
        {
            mutex.Close();
            mutex = null;
        }
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
            mutex.ReleaseMutex();
        base.Dispose(disposing);
    }

    static void Main()
    {
        App app = new App();
        if (app.mutex != null) Application.Run(app);
        else MessageBox.Show("Instance already running");
    }
}

Andere Tipps

i löste dieses Problem durch diese

[STAThread]
 static void Main()
    {

        Process[] result = Process.GetProcessesByName("ApplicationName");
        if (result.Length > 1)
        {
            MessageBox.Show("There is already a instance running.", "Information");
            System.Environment.Exit(0);
        }
        // here normal start 
    }

Es ist einfach, aber ich hatte kaum Zeit für bessere Lösungen zu überprüfen.

Mit Dank an Herren All und Powell :

    static void Main() 
    {
        using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) {
            if (!mutex.WaitOne(0, false)) {
                string processName = GetProcessName();
                BringOldInstanceToFront(processName);
            }
            else {
                GC.Collect();
                Application.Run(new Voting());
            }
        }
    }

    private static void BringOldInstanceToFront(string processName) {
        Process[] RunningProcesses = Process.GetProcessesByName(processName);
        if (RunningProcesses.Length > 0) {
            Process runningProcess = RunningProcesses[0];
            if (runningProcess != null) {
                IntPtr mainWindowHandle = runningProcess.MainWindowHandle;
                NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED);
            NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE);
            }
        }
    }

ich die Umwelt nicht wissen, dass Sie in arbeiten, aber etwas im Auge zu behalten über ‚Single-Instance-Anwendungen‘ ist, wie Sie Einzelinstanz definieren. Wenn die Anwendung auf mehreren Arbeitsstationen gleichzeitig ausgeführt werden kann, eine gemeinsame Datenquelle verwendet wird, ist das ein Problem? Ebenso was über eine Terminal-Services Situation (oder einem „Lauf als“ Situation), wo mehr als ein Benutzer in den gleichen Computer angemeldet ist, haben Sie die Anwendung in einer solchen Art und Weise beschränken möchten, dass nur eine Instanz pro Benutzer, pro -Computer? Oder bist du in Ordnung mit ihm einfach eine Instanz pro Benutzer zu sein?

Die Antwort auf diese könnten Sie in einer Richtung über die andere führen. Zum Beispiel haben wir eine ‚Single-Instance‘ Anwendung mit dem Umfang eine Gruppe von Computern zu sein. Nur ein Benutzer innerhalb dieser Gruppe von Workstations erlaubt auf. Wir haben es geschafft diese durch einen Tisch in unserer gemeinsamen Datenquelle haben, die aktuell verbundenen Benutzer verfolgt. Dies ist ein Wartungsproblem, wie Sie sicher sein müssen, dass Tabelle 100% genau die ganze Zeit ist. Handhabung Dinge wie unerwartete Stromausfälle auf der Workstation, „gefälschte“ Datensätze in dieser Tabelle verlassen dauerte eine sorgfältige Handhabung.

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