2011-06-22 4 views
2

J'ai une application mais actuellement ce n'est pas une application singleton. J'aime faire l'application singleton afin que son autre instance ne se termine pas à l'exécution.Comment créer une application singleton?

Si cela peut être fait, veuillez répondre avec quelques exemples de codes.

+3

Vous devez spécifier si vous voulez une instance par bureau, par utilisateur connecté, par ordinateur, ... Il est courant que les programmes choisissent « par ordinateur » lorsque l'un des d'autres choix est plus approprié. – CodesInChaos

+0

Voir http://stackoverflow.com/questions/2988960/how-to-make-application-singleton – ChrisF

+0

"son autre instance ne sort pas au moment de l'exécution" que voulez-vous dire par là? Le seul moyen que je connaisse est que le programme nouvellement démarré vérifie d'une certaine manière s'il existe déjà une instance et quitte ensuite (généralement après avoir activé l'ancienne instance et peut-être lui avoir envoyé des messages). – CodesInChaos

Répondre

3

Voici quelques exemples d'applications. Voici une façon possible.

public static Process RunningInstance() 
{ 
    Process current = Process.GetCurrentProcess(); 
    Process[] processes = Process.GetProcessesByName (current.ProcessName); 

    //Loop through the running processes in with the same name 
    foreach (Process process in processes) 
    { 
     //Ignore the current process 
     if (process.Id != current.Id) 
     { 
      //Make sure that the process is running from the exe file. 
      if (Assembly.GetExecutingAssembly().Location. 
       Replace("/", "\\") == current.MainModule.FileName) 

      { 
       //Return the other process instance. 
       return process; 

      } 
     } 
    } 
    //No other instance was found, return null. 
    return null; 
} 


if (MainForm.RunningInstance() != null) 
{ 
    MessageBox.Show("Duplicate Instance"); 
    //TODO: 
    //Your application logic for duplicate 
    //instances would go here. 
} 

De nombreuses autres façons. Voir les exemples pour des alternatives.

First one.

Second One.

Third One

+0

'Assembly.GetExecutingAssembly(). Location.Replace ("/"," \\ ") == current.MainModule.FileName' n'utilise pas' process'. Êtes-vous sûr que ce n'est pas un bug? Est-ce qu'il peut être déplacé en dehors de 'foreach' – Poma

1

L'approche que je connais est la suivante. Le programme doit tenter d'ouvrir un mutex nommé. Si ce mutex existait, alors quittez, sinon créez le mutex. Mais cela semble contredire votre condition selon laquelle "son autre instance ne sort pas au moment de l'exécution". Quoi qu'il en soit, peut-être que cela aussi était utile

1

Je pense que les codes suivants seront utiles pour vous. Voici le lien associé: http://geekswithblogs.net/chrisfalter/archive/2008/06/06/how-to-create-a-windows-form-singleton.aspx

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     /*==================================================== 
     * 
     * Add codes here to set the Winform as Singleton 
     * 
     * ==================================================*/ 
     bool mutexIsAvailable = false; 

     Mutex mutex = null; 

     try 
     { 
      mutex = new Mutex(true, "SampleOfSingletonWinForm.Singleton"); 
      mutexIsAvailable = mutex.WaitOne(1, false); // Wait only 1 ms 
     } 
     catch (AbandonedMutexException) 
     { 
      // don't worry about the abandonment; 
      // the mutex only guards app instantiation 
      mutexIsAvailable = true; 
     } 

     if (mutexIsAvailable) 
     { 
      try 
      { 
       Application.Run(new SampleOfSingletonWinForm()); 
      } 
      finally 
      { 
       mutex.ReleaseMutex(); 
      } 
     } 

     //Application.Run(new SampleOfSingletonWinForm()); 
    } 
} 
Questions connexes