2011-02-10 3 views
0

Bon après-midi.Méthode recommandée: App1.exe démarre le processus App2.exe, puis App2.exe doit fermer App1.exe

Je dois admettre que c'est un travail bizarre à faire, mais je en ai besoin ... :-)

Aujourd'hui, il y a une application console C# (je nommer App1.exe) appelé par mes collègues, travailler en COBOL. Lorsque le App1.exe termine son travail, se ferme, les programmes COBOL peuvent aller de l'avant et lire les fichiers générés à partir de App1.

Cette application1 est ouverte et fermée cent fois par jour, et ce n'est pas si rapide ... Maintenant, j'ai besoin d'obtenir une logique métier dans une application systray, toujours prête, pour répondre rapidement aux demandes, mais je ne peux pas forcer mon collègues pour modifier leurs programmes: ils n'appelleront jamais App1.exe, en attendant qu'il se ferme. Donc, je crée une seule instance App2.exe (je ne peux pas utiliser les services du système) qui font le travail; alors maintenant je pensais à cette solution: App1.exe appelle simplement App2.exe (en passant des arguments de ligne de commande), puis il reste en attente (en utilisant Process.Start (App2.exe) et Process.WaitForExit()). Lorsque App2.exe a fini de fonctionner, tue App1.exe, ainsi les programmes COBOL peuvent détecter que le travail est terminé et continuer à lire les fichiers générés depuis App2.exe.

Dans cette solution (rapide et sale, j'essaie juste ...) il y a un problème: App2.exe a été appelé par App1.exe, donc il semble qu'un exe appelé ne peut pas tuer son parent, isn ' t-il?

Il y a une meilleure façon de faire ce genre de travail? Je ne peux utiliser que C# 2.0.

Merci les gars, toute idée est la bienvenue.
Nando

+0

Pourriez-vous s'il vous plaît coller le code pertinent de l'application 1 et de l'application 2 (c'est-à-dire la logique de démarrage et de destruction du processus)? –

Répondre

2

Utilisez l'un des mécanismes de communication interprocessus pour que app1.exe communique avec app2.exe. Sockets, tubes nommés, Remoting, WCF. Puisque vous avez seulement besoin de passer une ligne de commande, un simple socket peut faire le travail. Quittez simplement app1.exe lorsque vous recevez un message de la part de app2.exe indiquant que le travail a été effectué, pas besoin de tuer quoi que ce soit.

+0

Je n'ai aucune expérience avec ce type de code, puisque je ne peux utiliser que C# 2.0, probablement à distance est le bon outil à utiliser. J'ai essayé IPC il y a des années, ce n'était pas si confortable à déboguer. Je vous remercie! –

0

Créez une application gestionnaire/moniteur qui supervise l'ensemble du processus. Il crée une nouvelle application enfant à la demande (App1). App1 peut ensuite demander que App2 est démarré, en demandant au gestionnaire/moniteur.

Si App2 veut alors fermer App1, il peut demander au gestionnaire/moniteur de le faire.

De cette façon, vous pouvez déboguer, consigner, surveiller, auditer et mettre en place des règles pour le démarrage/l'arrêt de chaque application. Beaucoup mieux!

+0

Cela pourrait être une solution, mais si je devais passer du temps à travailler sur du code, je l'aurais probablement dépensé pour la communication à distance.Je vous remercie! –

0

C'est le code que j'utilise pour appeler et tuer le processus.

//App1.exe 
var p = Process.Start("App2.exe", myargs); 
p.WaitForExit(); 

//App2.exe 
//do the work calling my App2.exe business logic plugin... 
//Close calling exe; caller variable is fullpath of my App1.exe, like D:\myapp\app1.exe 
Process[] pArry = Process.GetProcesses(); 
foreach (Process p in pArry) 
{ 
    string s = p.ProcessName; 
    s = s.ToLower(); 
    if (s.CompareTo(caller) == 0) 
    { 
     p.Kill(); 
    } 
} 

Code vraiment simple, peut-être trop simple pour travailler :-)
Merci!

0

J'ai trouvé un projet intéressant: WCF Killer.
Ceci est une implémentation simple mais puissante de la pile TCP client-serveur; probablement une bonne solution pour mes besoins. Bye, Nando