2010-11-09 5 views
1

J'ai un programme agent qui lancera plusieurs instances du même exécutable. Chacune de ces instances doit être associée à un ID individuel.Comment démarrer un processus avec des données supplémentaires, puis rechercher ce processus?

L'agent conserve une référence à l'objet Process qui a été utilisé pour charger l'instance, mais je dois considérer que l'agent peut être arrêté et redémarré sans affecter les instances démarrées.

Une fois que l'agent redémarre, j'en ai besoin pour rechercher les processus existants et pour relier une référence aux processus.

Comment puis-je affecter des données à un processus et les récupérer par la suite?

En ce moment, je commence le processus comme celui-ci:

this.AttachedProcess = new Process() 
{ 
    StartInfo = new ProcessStartInfo(filename) 
}; 

Et, plus tard, je dois rechercher ce processus en appelant Process.GetProcesses(). Bien que je puisse utiliser un argument de ligne de commande pour démarrer le processus (quelque chose comme -instance XX) et lire cette ligne de commande en utilisant this answer, j'aimerais savoir s'il existe une autre façon d'assigner des données supplémentaires à un processus et de les récupérer plus tard.

Répondre

2

Vous pourriez enregistrer le Process.Id des processus que vous créez dans un fichier.
Au démarrage vous lisez ce fichier et vérifier si ces processus encore sont mis en marche et vérifier que les matches de nom de fichier (si le système a redémarré d'autres processus auraient obtenu ces ids)

+0

Parfois, vous êtes tellement plongé dans un problème que vous négligez l'idée la plus simple. –

2

Vous pouvez créer une classe sérialisable ProcessInfo que stocke l'ID du processus et toute autre information que vous souhaitez associer au processus. Lorsque l'agent s'arrête (par exemple, si le service s'arrête, ou lorsqu'il est éliminé, ou qu'un événement de fermeture est déclenché, etc.), mettez-le en série dans un fichier. Quand il redémarre, il doit vérifier et lire dans le fichier d'informations du processus, ce qui rétablira essentiellement l'état de l'agent juste avant qu'il ne soit arrêté.

L'idée principale ici est que l'agent doit conserver cette information, pas Windows ou les processus individuels en cours d'exécution. La demande de données auxiliaires à partir d'un processus nécessite COM, WCF ou un autre service de messagerie, et cela est excessif pour le type d'interaction dont vous parlez. Voir le System.Runtime.Serialization namespace, en particulier le DataContractSerializer class.

Questions connexes