D'accord, j'ai créé mon application C #, créé un programme d'installation pour cela et le faire fonctionner sur ma machine. P>
Le problème est que lorsque l'utilisateur ouvre l'application EXE deux fois, il y aura deux instances de l'application en cours d'exécution. Je ne veux jamais qu'un seul cas de la demande soit en cours d'exécution à tout moment, comment puis-je faire cela? P>
Merci pour votre aide, P>
4 Réponses :
La technique commune pour cela est de créer un mutex code> et de vérifier sa présence sur la demande de démarrage de l'application.
S'il vous plaît afficher le code en réponse. Le premier lien était mort et d'autres peuvent éventuellement suivre de la poursuite.
Je ne connais pas l'environnement dans lequel vous opérez, mais quelque chose à garder à l'esprit à propos des "applications à instance mono-instance" est la manière dont vous définissez une seule instance. Si l'application peut être exécutée sur plusieurs postes de travail simultanément, en utilisant une source de données courante, est-ce un problème? De même, qu'en est-il de la situation des services Terminal-Services (ou une situation «exécutée») où plusieurs utilisateurs sont connectés à la même ordinateur, souhaitez-vous restreindre l'application de manière à ce qu'un seul instance par utilisateur, par -ordinateur? Ou êtes-vous d'accord avec cela simplement un exemple par utilisateur? P>
La réponse à celles-ci pourrait vous amener dans une direction sur une autre. Par exemple, nous avons une application «instance unique» avec la portée étant un groupe d'ordinateurs. Un seul utilisateur est autorisé dans ce groupe de postes de travail. Nous avons réussi à cela par une table dans notre source de données partagée qui suivit les utilisateurs actuellement connectés. Il s'agit d'un problème de maintenance que vous devez être sûr que la table est précise à 100% tout le temps. Traitement des choses comme des pannes de courant inattendues sur le poste de travail, laissant des records «faux» dans ce tableau prenant une manipulation minutieuse. P>
avec grâce à MMS. 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);
}
}
}
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 }
Si quelqu'un prend une copie de l'application dans un nom différent et commence comme un nouveau processus, il y aura plusieurs instances. Ainsi utilisez un ProcessObject.MainMoDule.FileInfo CODE> Description ou nom de fichier d'origine .. Cela ne change pas même si le fichier exécutable est renommé