empêche l’application ac # d’exécuter plus d’une instance

J’ai écrit un programme en c # maintenant j’aimerais savoir quelle est la bonne façon d’empêcher le démarrage du programme s’il est déjà en cours d’exécution?

donc s’il est déjà en cours d’exécution, et double-cliquez sur le programme, il ne démarrera pas car il est déjà en cours d’exécution.

Je peux le faire, mais je pensais à une manière standard et appropriée.

La méthode recommandée consiste à utiliser un mutex système.

bool createdNew; using(var mutex = new System.Threading.Mutex(true, "MyAppName", out createdNew)) { if (createdNew) // first instance Application.Run(); else MessageBox.Show("There is already an instace running"); } 

Le premier paramètre du mutex ctor lui dit de créer un mutex à l’échelle du système pour ce thread. Si le mutex existe déjà, il retournera false via le 3ème paramètre.

Mettre à jour
Où mettre ça? Je mettrais ceci dans program.cs. Si vous le mettez dans form_load, vous devrez conserver le mutex pendant toute la durée de vie de l’application (le mutex doit être membre du formulaire) et le relâcher manuellement dans le formulaire unload.
Plus tôt vous l’appelez, mieux ce sera avant que l’autre application n’ouvre des connexions à une firebase database, etc., et avant que des ressources ne soient créées pour des formulaires / contrôleurs, etc.

Manière rapide je l’ai fait dans l’une des applications .. Vous pouvez consulter la liste des processus en cours d’exécution pour voir si l’application actuelle est déjà en cours d’exécution et ne pas redémarrer l’application.

 Process[] lprcTestApp = Process.GetProcessesByName("TestApplication"); if (lprcTestApp.Length > 0) { // The TestApplication is already running, don't run it again } 

Je pense que l’énumération de la liste de processus pourrait être lente. Vous pouvez également créer un mutex à l’aide de la classe System.Threading.Mutex et vérifier s’il est déjà créé au démarrage du processus. Cependant, cela nécessiterait d’appeler le code système Win32 afin de ne pas être totalement agnostique sur la plate-forme.

Jetez un coup d’œil à l’ article de blog de Scotts et ne vous laissez pas berner par le nom de l’assemblée. C’est juste un nom de fichier d’un fichier standard dans le framework .Net.

Voici d’autres informations provenant directement de MSDN pour WindowsFormsApplicationBase .

Vous pouvez utiliser un sémaphore à l’ échelle du système, à l’aide du constructeur Semaphore Constructor (Int32, Int32, Ssortingng, Boolean%) et d’un nom relativement unique.

Cordialement, Matthias

Si votre application produit / consum des fichiers, il est préférable d’enregistrer un mécanisme de communication à l’échelle du système (par exemple, un sharepoint terminaison à distance ou WCF, voire un socket). Ensuite, si la deuxième instance de l’application est lancée en double-cliquant sur l’un de vos fichiers, vous pouvez envoyer les informations sur le fichier à l’instance en cours d’exécution.

Sinon, s’il s’agit d’un programme autonome, comme d’autres l’ont déjà dit, un mutex ou un sémaphore servirait également.

solution dans une application de formulaire Windows Interdit d’exécuter à nouveau l’application (application de réouverture).

1- ajoutez d’abord la classe RunAlready.cs

Méthode 2-call processIsRunning () avec le processus de nom de RunAlready.cs dans Program.cs

Program.cs:

 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace Tirage.MainStand { static class Program { ///  /// The main entry point for the application. ///  [STAThread] static void Main() { PublicClass.Class.RunAlready RunAPP = new PublicClass.Class.RunAlready(); ssortingng outApp = RunAPP.processIsRunning("Tirage.MainStand"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); MainStand_FrmLogin fLogin = new MainStand_FrmLogin(); if (outApp.Length == 0) { if (fLogin.ShowDialog() == DialogResult.OK) { Application.Run(new MainStand_masterFrm()); } } else MessageBox.Show( "Instance already running"); } } } 

classe RunAlready:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PublicClass.Class { public class RunAlready { public ssortingng processIsRunning(ssortingng process) { ssortingng xdescription = ""; System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName(process); foreach (System.Diagnostics.Process proc in processes) { var iddd = System.Diagnostics.Process.GetCurrentProcess().Id; if (proc.Id != System.Diagnostics.Process.GetCurrentProcess().Id) { xdescription = "Application Run At time:" + proc.StartTime.ToSsortingng() + System.Environment.NewLine; xdescription += "Current physical memory : " + proc.WorkingSet64.ToSsortingng() + System.Environment.NewLine; xdescription += "Total processor time : " + proc.TotalProcessorTime.ToSsortingng() + System.Environment.NewLine; xdescription += "Virtual memory size : " + proc.VirtualMemorySize64.ToSsortingng() + System.Environment.NewLine; } } return xdescription; } } }