2010-11-11 4 views
2

Disons que j'ai une application écrite en C# appelée EquipCtrl.exe qui s'exécute comme un processus local sur un PC pour contrôler un équipement..NET - limiter le nombre d'instances d'une unité d'exécution

Évidemment, je souhaiterais n'avoir qu'une seule instance d'Equipctrl à exécuter sur chaque PC. Si j'avais deux équipements à contrôler par PC, je le limiterais à deux instances par PC.

Comme je l'ai fait était l'un des 1. Nom du processus. Je nomme le processus EqCtrl et au démarrage du processus, il compterait les processus de nombre avec le nom "EqCtrl". 2. Nom de l'exécution. Au démarrage, comptez le nombre de processus avec le nom d'exécution EquipCtrl.exe. 3. Enregistrement du registre. 4. Enregistrement de la base de données SQL Server.

Pour moi, le nom du processus ou la détection du nom d'exécution est le plus simple et ce que je fais le plus (sinon la totalité) du temps. Mais, ils sont susceptibles de conflit de noms. Même si je vais plus loin pour trouver le chemin d'exécution, la limite pourrait être contournée en copiant le fichier d'exécution dans un autre dossier.

Quelle est la meilleure façon d'effectuer une limitation d'exécution sur .NET? Pourquoi? Le registre est-il le meilleur moyen?

Répondre

7

Essayez un système à l'échelle Sémaphore: http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

+0

+1 (si je pouvais voter). J'ai utilisé ceci dans les applications C, et ça devrait marcher très bien en C#. Il y a un peu de travail à faire, comme vérifier si un autre processus a déjà créé le sémaphore. Sinon, essayez de le créer. Si cela existe déjà, vous devez voir si vous pouvez le verrouiller. Le verrou doit essayer de verrouiller le sémaphore avec un délai d'expiration. Si le délai expire, votre processus en est un de plus et devrait se terminer. Il y a un peu de travail pour bien faire les choses, mais c'est la bonne réponse à la question. –

+0

Et utilisez un sémaphore nommé, avec toutes les instances de processus utilisant le même nom. –

0

Hmm .. quand on veut permettre à une seule instance d'une application, nous utilisons un named mutex

Cela ne permet pas exactement le scénario que vous désirez .

Un autre point, pour éviter les collisions, en plus du nom et du répertoire de l'exécutable, utilise un hachage MD5 du fichier exécutable.

1
+0

L'article ne semble pas répondre au besoin occasionnel d'autoriser plus d'une instance du programme sur un PC. –

+0

Cela dépend de la façon dont vous avez géré OnStartupNextInstance; la partie que j'ai trouvée intéressante et relavent était que les développeurs C# n'envisagent jamais d'utiliser les outils disponibles dans l'assembly Microsoft.VisualBasic parce que c'est "mauvais"; Cependant, il existe des outils utiles qui peuvent sauver l'effort de développement. –

0

Vous pouvez le faire avec le comptage nommé mutex \ sémaphores, assurez-vous également que le préfixe mutex/sémaphores vous créez commence par GLOBAL \ et LOCAL \ sinon la connexion de bureau à distance ne lira pas ces mutex nommés et le compte sera perdu.

http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx

Questions connexes