Question

D'accord, j'ai donc créé mon application c #, créé un programme d'installation et installé-la sur ma machine.

Le problème est que, lorsque l'utilisateur ouvre deux fois le fichier exe de l'application, deux instances de l'application s'exécutent. Je ne veux qu’une seule instance de l’application en cours d’exécution, comment puis-je procéder?

Merci de votre aide,

Était-ce utile?

La solution

La technique courante consiste à créer un Mutex nommé et à vérifier sa présence au démarrage de l'application.

Voir this ou this .

Code de 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");
    }
}

Autres conseils

J'ai résolu ce problème par ce

[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 
    }

c’est simple, mais j’avais à peine le temps de chercher de meilleures solutions.

Merci à Messieurs Allen et 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);
            }
        }
    }

Je ne connais pas l'environnement dans lequel vous évoluez, mais vous devez garder à l'esprit les "applications à instance unique", c'est la façon dont vous définissez une instance unique. Si l'application peut être exécutée sur plusieurs postes de travail en même temps, en utilisant une source de données commune, est-ce un problème? De même, qu'en est-il d'une situation de services de terminal (ou d'une situation "exécuté en tant que") où plusieurs utilisateurs sont connectés au même ordinateur, souhaitez-vous restreindre l'application de telle sorte qu'une seule instance par utilisateur, par ordinateur? Ou êtes-vous d'accord pour qu'il s'agisse simplement d'une instance par utilisateur?

La réponse à ces questions pourrait vous conduire dans une direction plutôt que dans une autre. Par exemple, nous avons une application 'à instance unique' avec un groupe d’ordinateurs. Un seul utilisateur est autorisé dans ce groupe de postes de travail. Nous avons géré cela en créant une table dans notre source de données partagée qui suivait les utilisateurs actuellement connectés. Il s’agit d’un problème de maintenance car vous devez vous assurer que la table est précise à 100% tout le temps. Gestion de tâches telles que des coupures de courant imprévues sur le poste de travail, laissant "fictif" les enregistrements de cette table ont été manipulés avec précaution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top